aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2011-09-07 23:10:15 +0000
committerJim Grosbach <grosbach@apple.com>2011-09-07 23:10:15 +0000
commitab899c1bcca7f1cc85342c3a686464ba4af035df (patch)
tree1a630b9d51b931f74524916d83af8fcd44dcab1c /lib/Target/ARM/AsmParser/ARMAsmParser.cpp
parent3e328ecbd869e0e5cd309ddd793da6857e3b4431 (diff)
downloadexternal_llvm-ab899c1bcca7f1cc85342c3a686464ba4af035df.zip
external_llvm-ab899c1bcca7f1cc85342c3a686464ba4af035df.tar.gz
external_llvm-ab899c1bcca7f1cc85342c3a686464ba4af035df.tar.bz2
Thumb2 assembly parsing and encoding for LDR(register).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139264 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/AsmParser/ARMAsmParser.cpp')
-rw-r--r--lib/Target/ARM/AsmParser/ARMAsmParser.cpp18
1 files changed, 17 insertions, 1 deletions
diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index 9efdd42..6df2d56 100644
--- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -680,6 +680,16 @@ public:
return false;
return true;
}
+ bool isT2MemRegOffset() const {
+ if (Kind != Memory || !Mem.OffsetRegNum || Mem.isNegative)
+ return false;
+ // Only lsl #{0, 1, 2, 3} allowed.
+ if (Mem.ShiftType == ARM_AM::no_shift)
+ return true;
+ if (Mem.ShiftType != ARM_AM::lsl || Mem.ShiftImm > 3)
+ return false;
+ return true;
+ }
bool isMemThumbRR() const {
// Thumb reg+reg addressing is simple. Just two registers, a base and
// an offset. No shifts, negations or any other complicating factors.
@@ -844,7 +854,6 @@ public:
ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm)));
}
-
void addShifterImmOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) |
@@ -1145,6 +1154,13 @@ public:
Inst.addOperand(MCOperand::CreateImm(Val));
}
+ void addT2MemRegOffsetOperands(MCInst &Inst, unsigned N) const {
+ assert(N == 3 && "Invalid number of operands!");
+ Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));
+ Inst.addOperand(MCOperand::CreateReg(Mem.OffsetRegNum));
+ Inst.addOperand(MCOperand::CreateImm(Mem.ShiftImm));
+ }
+
void addMemThumbRROperands(MCInst &Inst, unsigned N) const {
assert(N == 2 && "Invalid number of operands!");
Inst.addOperand(MCOperand::CreateReg(Mem.BaseRegNum));