Thumb parsing and encoding support for NOP.
authorJim Grosbach <grosbach@apple.com>
Fri, 19 Aug 2011 23:24:36 +0000 (23:24 +0000)
committerJim Grosbach <grosbach@apple.com>
Fri, 19 Aug 2011 23:24:36 +0000 (23:24 +0000)
The irony is not lost that this is not a completely trivial patchset.

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

lib/Target/ARM/ARMInstrThumb.td
lib/Target/ARM/AsmParser/ARMAsmParser.cpp
lib/Target/ARM/InstPrinter/ARMInstPrinter.cpp
test/MC/ARM/basic-thumb-instructions.s
test/MC/ARM/thumb.s

index 197afeb11fd54c452dd5047d8ef235f1edc32caa..a151c0dfaafad43783dff087ba1dd1001c32d1d6 100644 (file)
@@ -237,7 +237,8 @@ class T1SystemEncoding<bits<8> opc>
 }
 
 def tNOP : T1pI<(outs), (ins), NoItinerary, "nop", "", []>,
-           T1SystemEncoding<0x00>; // A8.6.110
+           T1SystemEncoding<0x00>, // A8.6.110
+        Requires<[IsThumb2]>;
 
 def tYIELD : T1pI<(outs), (ins), NoItinerary, "yield", "", []>,
            T1SystemEncoding<0x10>; // A8.6.410
@@ -1382,3 +1383,8 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
                   2, IIC_Br, [(brind GPR:$Rm)],
                   (tMOVr PC, GPR:$Rm, pred:$p)>;
 }
+
+
+// In Thumb1, "nop" is encoded as a "mov r8, r8". Technically, the bf00
+// encoding is available on ARMv6K, but we don't differentiate that finely.
+def : InstAlias<"nop", (tMOVr R8, R8, 14, 0)>,Requires<[IsThumb, IsThumb1Only]>;
index 6a14387640e967e94b18634cee03004ee146aa18..3e768f253175b49d53f6898599ede1f00b707ed1 100644 (file)
@@ -2846,6 +2846,7 @@ getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
       Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" ||
       Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "clrex" ||
       Mnemonic == "setend" ||
+      (Mnemonic == "nop" && isThumbOne()) ||
       ((Mnemonic == "pld" || Mnemonic == "pli") && !isThumb()) ||
       ((Mnemonic.startswith("rfe") || Mnemonic.startswith("srs"))
         && !isThumb()) ||
index 1999ee7a6f55994baeddc151b4df3c59c72beb69..153f68d62c8f726e87577e9af4787b6747f3a537 100644 (file)
@@ -169,6 +169,13 @@ void ARMInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
     return;
   }
 
+  // Thumb1 NOP
+  if (Opcode == ARM::tMOVr && MI->getOperand(0).getReg() == ARM::R8 &&
+      MI->getOperand(1).getReg() == ARM::R8) {
+    O << "\tnop";
+    return;
+  }
+
   printInstruction(MI, O);
 }
 
index 5e45c3c7dc25e8da1344a4e70efe80186cc1d8d3..13d1964936664d32d9c162bd43be84e0949ff541 100644 (file)
@@ -347,3 +347,11 @@ _func:
         negs r3, r4
 
 @ CHECK: rsbs  r3, r4, #0              @ encoding: [0x63,0x42]
+
+
+@------------------------------------------------------------------------------
+@ NOP
+@------------------------------------------------------------------------------
+        nop
+
+@ CHECK: nop                            @ encoding: [0xc0,0x46]
index 497d45d827a71cd4190e2438db62e9bff121d1e3..625882c737fb574f0209a487aaa708df2a3823d5 100644 (file)
@@ -42,7 +42,7 @@
 @ CHECK: bkpt  #2                       @ encoding: [0x02,0xbe]
 
         nop
-@ CHECK: nop @ encoding: [0x00,0xbf]
+@ CHECK: nop @ encoding: [0xc0,0x46]
 
         wfe
         wfi