Fix recognition of ARM 'adcs' mnemonic.
authorJim Grosbach <grosbach@apple.com>
Mon, 11 Jul 2011 17:09:57 +0000 (17:09 +0000)
committerJim Grosbach <grosbach@apple.com>
Mon, 11 Jul 2011 17:09:57 +0000 (17:09 +0000)
The 'CS' is not a predication suffix in this case.

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

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

index d8fd809c4b084d6ef6325cf880146cc957407728..8bfefdfb3a3cfd88b6e428786894f9d2751b8b7e 100644 (file)
@@ -1808,29 +1808,32 @@ static StringRef SplitMnemonic(StringRef Mnemonic,
        Mnemonic == "vqdmlal" || Mnemonic == "bics"))
     return Mnemonic;
 
-  // First, split out any predication code.
-  unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
-    .Case("eq", ARMCC::EQ)
-    .Case("ne", ARMCC::NE)
-    .Case("hs", ARMCC::HS)
-    .Case("cs", ARMCC::HS)
-    .Case("lo", ARMCC::LO)
-    .Case("cc", ARMCC::LO)
-    .Case("mi", ARMCC::MI)
-    .Case("pl", ARMCC::PL)
-    .Case("vs", ARMCC::VS)
-    .Case("vc", ARMCC::VC)
-    .Case("hi", ARMCC::HI)
-    .Case("ls", ARMCC::LS)
-    .Case("ge", ARMCC::GE)
-    .Case("lt", ARMCC::LT)
-    .Case("gt", ARMCC::GT)
-    .Case("le", ARMCC::LE)
-    .Case("al", ARMCC::AL)
-    .Default(~0U);
-  if (CC != ~0U) {
-    Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
-    PredicationCode = CC;
+  // First, split out any predication code. Ignore mnemonics we know aren't
+  // predicated but do have a carry-set and so weren't caught above.
+  if (Mnemonic != "adcs") {
+    unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
+      .Case("eq", ARMCC::EQ)
+      .Case("ne", ARMCC::NE)
+      .Case("hs", ARMCC::HS)
+      .Case("cs", ARMCC::HS)
+      .Case("lo", ARMCC::LO)
+      .Case("cc", ARMCC::LO)
+      .Case("mi", ARMCC::MI)
+      .Case("pl", ARMCC::PL)
+      .Case("vs", ARMCC::VS)
+      .Case("vc", ARMCC::VC)
+      .Case("hi", ARMCC::HI)
+      .Case("ls", ARMCC::LS)
+      .Case("ge", ARMCC::GE)
+      .Case("lt", ARMCC::LT)
+      .Case("gt", ARMCC::GT)
+      .Case("le", ARMCC::LE)
+      .Case("al", ARMCC::AL)
+      .Default(~0U);
+    if (CC != ~0U) {
+      Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
+      PredicationCode = CC;
+    }
   }
 
   // Next, determine if we have a carry setting bit. We explicitly ignore all
diff --git a/test/MC/ARM/basic-arm-instructions.s b/test/MC/ARM/basic-arm-instructions.s
new file mode 100644 (file)
index 0000000..cf90a23
--- /dev/null
@@ -0,0 +1,31 @@
+@ RUN: llvm-mc -triple=armv7-apple-darwin -show-encoding < %s | FileCheck %s
+  .syntax unified
+  .globl _func
+_func:
+@ CHECK: _func
+
+@ ADC (immediate)
+  adc r1, r2, #0xf
+  adc r1, r2, #0xf0
+  adc r1, r2, #0xf00
+  adc r1, r2, #0xf000
+  adc r1, r2, #0xf0000
+  adc r1, r2, #0xf00000
+  adc r1, r2, #0xf000000
+  adc r1, r2, #0xf0000000
+  adc r1, r2, #0xf000000f
+  adcs r1, r2, #0xf00
+  adcseq r1, r2, #0xf00
+
+@ CHECK: adc   r1, r2, #15             @ encoding: [0x0f,0x10,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #240            @ encoding: [0xf0,0x10,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #3840           @ encoding: [0x0f,0x1c,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #61440          @ encoding: [0x0f,0x1a,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #983040         @ encoding: [0x0f,0x18,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #15728640       @ encoding: [0x0f,0x16,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #251658240      @ encoding: [0x0f,0x14,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #4026531840     @ encoding: [0x0f,0x12,0xa2,0xe2]
+@ CHECK: adc   r1, r2, #4026531855     @ encoding: [0xff,0x12,0xa2,0xe2]
+
+@ CHECK: adcs  r1, r2, #3840           @ encoding: [0x0f,0x1c,0xb2,0xe2]
+@ CHECK: adcseq        r1, r2, #3840           @ encoding: [0x0f,0x1c,0xb2,0x02]