add printing support for SOImm operands, getting us to:
authorChris Lattner <sabre@nondot.org>
Mon, 19 Oct 2009 21:21:39 +0000 (21:21 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 19 Oct 2009 21:21:39 +0000 (21:21 +0000)
_main:
stm ,
mov r7, sp
sub sp, sp, #4
mov r0, #0
str r0,

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

lib/Target/ARM/AsmPrinter/ARMAsmPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMInstPrinter.cpp
lib/Target/ARM/AsmPrinter/ARMInstPrinter.h

index ec26b26330e3a0d845b61a83718c39502556d44d..d5e2991ec5041e82897fba26da3784a84fed583b 100644 (file)
@@ -85,7 +85,7 @@ namespace {
     }
     
     void printMCInst(const MCInst *MI) {
-      ARMInstPrinter(O, *MAI).printInstruction(MI);
+      ARMInstPrinter(O, *MAI, VerboseAsm).printInstruction(MI);
     }
     
     void printInstructionThroughMCStreamer(const MachineInstr *MI);
index fc1e53f38752b9850799d50b7a4ea54fe9206c22..8393e241284d5f210b4afcb134b2755e02b885d1 100644 (file)
@@ -13,8 +13,9 @@
 
 #define DEBUG_TYPE "asm-printer"
 #include "ARMInstPrinter.h"
+#include "ARMAddressingModes.h"
 #include "llvm/MC/MCInst.h"
-//#include "llvm/MC/MCAsmInfo.h"
+#include "llvm/MC/MCAsmInfo.h"
 //#include "llvm/MC/MCExpr.h"
 //#include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormattedStream.h"
@@ -47,3 +48,34 @@ void ARMInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
     //Op.getExpr()->print(O, &MAI);
   }
 }
+
+static void printSOImm(raw_ostream &O, int64_t V, bool VerboseAsm,
+                       const MCAsmInfo *MAI) {
+  // Break it up into two parts that make up a shifter immediate.
+  V = ARM_AM::getSOImmVal(V);
+  assert(V != -1 && "Not a valid so_imm value!");
+  
+  unsigned Imm = ARM_AM::getSOImmValImm(V);
+  unsigned Rot = ARM_AM::getSOImmValRot(V);
+  
+  // Print low-level immediate formation info, per
+  // A5.1.3: "Data-processing operands - Immediate".
+  if (Rot) {
+    O << "#" << Imm << ", " << Rot;
+    // Pretty printed version.
+    if (VerboseAsm)
+      O << ' ' << MAI->getCommentString()
+      << ' ' << (int)ARM_AM::rotr32(Imm, Rot);
+  } else {
+    O << "#" << Imm;
+  }
+}
+
+
+/// printSOImmOperand - SOImm is 4-bit rotate amount in bits 8-11 with 8-bit
+/// immediate in bits 0-7.
+void ARMInstPrinter::printSOImmOperand(const MCInst *MI, unsigned OpNum) {
+  const MCOperand &MO = MI->getOperand(OpNum);
+  assert(MO.isImm() && "Not a valid so_imm value!");
+  printSOImm(O, MO.getImm(), VerboseAsm, &MAI);
+}
index 9c4355fc29b42fe0dc7d55b040acb5c8e6472315..2b99dfd3d538d3690678d28282d85e89aec8bfa0 100644 (file)
@@ -20,8 +20,10 @@ namespace llvm {
   class MCOperand;
   
 class ARMInstPrinter : public MCInstPrinter {
+  bool VerboseAsm;
 public:
-  ARMInstPrinter(raw_ostream &O, const MCAsmInfo &MAI) : MCInstPrinter(O, MAI){}
+  ARMInstPrinter(raw_ostream &O, const MCAsmInfo &MAI, bool verboseAsm)
+    : MCInstPrinter(O, MAI), VerboseAsm(verboseAsm) {}
 
   virtual void printInst(const MCInst *MI);
   
@@ -33,7 +35,9 @@ public:
   void printOperand(const MCInst *MI, unsigned OpNo,
                     const char *Modifier = 0);
     
-  void printSOImmOperand(const MCInst *MI, unsigned OpNum) {}
+  void printSOImmOperand(const MCInst *MI, unsigned OpNum);
+  
+  
   void printSOImm2PartOperand(const MCInst *MI, unsigned OpNum) {}
   void printSORegOperand(const MCInst *MI, unsigned OpNum) {}
   void printAddrMode2Operand(const MCInst *MI, unsigned OpNum) {}