summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp15
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp b/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
index 3b2ca73aec..716b22e3b3 100644
--- a/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
+++ b/lib/Target/ARM/MCTargetDesc/ARMMCCodeEmitter.cpp
@@ -271,8 +271,19 @@ public:
unsigned getSOImmOpValue(const MCInst &MI, unsigned Op,
SmallVectorImpl<MCFixup> &Fixups,
const MCSubtargetInfo &STI) const {
- unsigned SoImm = MI.getOperand(Op).getImm();
- int SoImmVal = ARM_AM::getSOImmVal(SoImm);
+ int SoImmVal = -1;
+
+ const MCOperand &MO = MI.getOperand(Op);
+ if (MO.isImm()) {
+ SoImmVal = ARM_AM::getSOImmVal(MO.getImm());
+ } else if (MO.isExpr()) {
+ int64_t Value;
+ bool Invalid = MO.getExpr()->EvaluateAsAbsolute(Value);
+ assert(!Invalid && "non-constant expression is not a valid SOImm operand");
+ assert((Value >= INT32_MIN && Value <= INT32_MAX) &&
+ "expression must be representable in 32 bits");
+ SoImmVal = Value;
+ }
assert(SoImmVal != -1 && "Not a valid so_imm value!");
// Encode rotate_imm.