ARM IAS: support #:{lower,upper}16: for GNU compatibility
authorSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 10 Jan 2014 04:38:40 +0000 (04:38 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Fri, 10 Jan 2014 04:38:40 +0000 (04:38 +0000)
The GNU assembler supports prefixing the expression with a '#' to indiciate that
the value that is being moved is infact a constant.  This improves the
compatibility of the integrated assembler's parser for this.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198916 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/AsmParser/ARMAsmParser.cpp
test/MC/ARM/target-expressions.s [new file with mode: 0644]

index bebbab5327be2f8bc0fdda6f9e96971c05efafc3..77cdb7563308bd4dcd218e3a78bfcbd4b8abd4ea 100644 (file)
@@ -4813,6 +4813,10 @@ bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
 bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) {
   RefKind = ARMMCExpr::VK_ARM_None;
 
+  // consume an optional '#' (GNU compatibility)
+  if (getLexer().is(AsmToken::Hash))
+    Parser.Lex();
+
   // :lower16: and :upper16: modifiers
   assert(getLexer().is(AsmToken::Colon) && "expected a :");
   Parser.Lex(); // Eat ':'
diff --git a/test/MC/ARM/target-expressions.s b/test/MC/ARM/target-expressions.s
new file mode 100644 (file)
index 0000000..350408c
--- /dev/null
@@ -0,0 +1,44 @@
+@ RUN: llvm-mc -triple armv7-eabi -filetype asm -o - %s | FileCheck %s
+
+       .syntax unified
+
+       .type function,%function
+function:
+       bx lr
+
+.set deadbeat, 0xdeadbea7
+
+       .type test,%function
+test:
+       movw r0, :lower16:function
+       movt r0, :upper16:function
+
+       movw r1, #:lower16:function
+       movt r1, #:upper16:function
+
+       movw r2, :lower16:deadbeat
+       movt r2, :upper16:deadbeat
+
+       movw r3, #:lower16:deadbeat
+       movt r3, #:upper16:deadbeat
+
+       movw r4, :lower16:0xD1510D6E
+       movt r4, :upper16:0xD1510D6E
+
+       movw r5, #:lower16:0xD1510D6E
+       movt r5, #:upper16:0xD1510D6E
+
+@ CHECK-LABEL: test:
+@ CHECK:       movw r0, :lower16:function
+@ CHECK:       movt r0, :upper16:function
+@ CHECK:       movw r1, :lower16:function
+@ CHECK:       movt r1, :upper16:function
+@ CHECK:       movw r2, :lower16:(3735928487)
+@ CHECK:       movt r2, :upper16:(3735928487)
+@ CHECK:       movw r3, :lower16:(3735928487)
+@ CHECK:       movt r3, :upper16:(3735928487)
+@ CHECK:       movw r4, :lower16:(3511749998)
+@ CHECK:       movt r4, :upper16:(3511749998)
+@ CHECK:       movw r5, :lower16:(3511749998)
+@ CHECK:       movt r5, :upper16:(3511749998)
+