ARM support the .arm and .thumb directives for assembly mode switching.
authorJim Grosbach <grosbach@apple.com>
Wed, 7 Dec 2011 18:04:19 +0000 (18:04 +0000)
committerJim Grosbach <grosbach@apple.com>
Wed, 7 Dec 2011 18:04:19 +0000 (18:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146042 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/AsmParser/ARMAsmParser.cpp
test/MC/ARM/mode-switch.s

index ded7d50c1efe407748a35c7bcab6742a04858d81..07f8f423295d5800e83739b4498f9f6165864308 100644 (file)
@@ -92,6 +92,7 @@ class ARMAsmParser : public MCTargetAsmParser {
                               unsigned &ShiftAmount);
   bool parseDirectiveWord(unsigned Size, SMLoc L);
   bool parseDirectiveThumb(SMLoc L);
+  bool parseDirectiveARM(SMLoc L);
   bool parseDirectiveThumbFunc(SMLoc L);
   bool parseDirectiveCode(SMLoc L);
   bool parseDirectiveSyntax(SMLoc L);
@@ -5622,6 +5623,8 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
     return parseDirectiveWord(4, DirectiveID.getLoc());
   else if (IDVal == ".thumb")
     return parseDirectiveThumb(DirectiveID.getLoc());
+  else if (IDVal == ".arm")
+    return parseDirectiveARM(DirectiveID.getLoc());
   else if (IDVal == ".thumb_func")
     return parseDirectiveThumbFunc(DirectiveID.getLoc());
   else if (IDVal == ".code")
@@ -5663,9 +5666,22 @@ bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
     return Error(L, "unexpected token in directive");
   Parser.Lex();
 
-  // TODO: set thumb mode
-  // TODO: tell the MC streamer the mode
-  // getParser().getStreamer().Emit???();
+  if (!isThumb())
+    SwitchMode();
+  getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16);
+  return false;
+}
+
+/// parseDirectiveARM
+///  ::= .arm
+bool ARMAsmParser::parseDirectiveARM(SMLoc L) {
+  if (getLexer().isNot(AsmToken::EndOfStatement))
+    return Error(L, "unexpected token in directive");
+  Parser.Lex();
+
+  if (isThumb())
+    SwitchMode();
+  getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
   return false;
 }
 
index 9d4995439e82a1336505ec90944f50ba01fea304..afcc082ba60d5f29a66f0c47cca2cc31f1ffa809 100644 (file)
 .code 16
         adds    r0, r0, r1
 @ CHECK: adds  r0, r0, r1              @ encoding: [0x40,0x18]
+
+.arm
+       add     r0, r0, r1
+@ CHECK: add   r0, r0, r1              @ encoding: [0x01,0x00,0x80,0xe0]
+
+.thumb
+       add.w   r0, r0, r1
+        adds    r0, r0, r1
+
+@ CHECK: add.w r0, r0, r1              @ encoding: [0x00,0xeb,0x01,0x00]
+@ CHECK: adds  r0, r0, r1              @ encoding: [0x40,0x18]