implement basic support for memory operands and crbit operands,
authorChris Lattner <sabre@nondot.org>
Sun, 14 Nov 2010 20:22:56 +0000 (20:22 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 14 Nov 2010 20:22:56 +0000 (20:22 +0000)
this fixes 3 more ppc tests.

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

lib/Target/PowerPC/InstPrinter/PPCInstPrinter.cpp
lib/Target/PowerPC/InstPrinter/PPCInstPrinter.h

index fcb5f2fefdd30369c417da27ceaeef05ad307cff..2e5060b019bbd7d3aba3274ce34b86c4ec572fe5 100644 (file)
@@ -88,6 +88,71 @@ void PPCInstPrinter::printS16X4ImmOperand(const MCInst *MI, unsigned OpNo,
 #endif
 }
 
+void PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo,
+                                 raw_ostream &O) {
+  unsigned CCReg = MI->getOperand(OpNo).getReg();
+  unsigned RegNo;
+  switch (CCReg) {
+  default: assert(0 && "Unknown CR register");
+  case PPC::CR0: RegNo = 0; break;
+  case PPC::CR1: RegNo = 1; break;
+  case PPC::CR2: RegNo = 2; break;
+  case PPC::CR3: RegNo = 3; break;
+  case PPC::CR4: RegNo = 4; break;
+  case PPC::CR5: RegNo = 5; break;
+  case PPC::CR6: RegNo = 6; break;
+  case PPC::CR7: RegNo = 7; break;
+  }
+  O << (0x80 >> RegNo);
+}
+
+void PPCInstPrinter::printMemRegImm(const MCInst *MI, unsigned OpNo,
+                                    raw_ostream &O) {
+  printSymbolLo(MI, OpNo, O);
+  O << '(';
+  assert(MI->getOperand(OpNo+1).isReg() && "Bad operand");
+  // FIXME: Simplify.
+  if (MI->getOperand(OpNo+1).isReg() &&
+      MI->getOperand(OpNo+1).getReg() == PPC::R0)
+    O << "0";
+  else
+    printOperand(MI, OpNo+1, O);
+  O << ')';
+}
+
+void PPCInstPrinter::printMemRegImmShifted(const MCInst *MI, unsigned OpNo,
+                                           raw_ostream &O) {
+  if (MI->getOperand(OpNo).isImm())
+    printS16X4ImmOperand(MI, OpNo, O);
+  else
+    printSymbolLo(MI, OpNo, O);
+  O << '(';
+  
+  assert(MI->getOperand(OpNo+1).isReg() && "Bad operand");
+  // FIXME: Simplify.
+  if (MI->getOperand(OpNo+1).isReg() &&
+      MI->getOperand(OpNo+1).getReg() == PPC::R0)
+    O << "0";
+  else
+    printOperand(MI, OpNo+1, O);
+  O << ')';
+}
+
+
+void PPCInstPrinter::printMemRegReg(const MCInst *MI, unsigned OpNo,
+                                    raw_ostream &O) {
+  // When used as the base register, r0 reads constant zero rather than
+  // the value contained in the register.  For this reason, the darwin
+  // assembler requires that we print r0 as 0 (no r) when used as the base.
+  if (MI->getOperand(OpNo).getReg() == PPC::R0)
+    O << "0";
+  else
+    printOperand(MI, OpNo, O);
+  O << ", ";
+  printOperand(MI, OpNo+1, O);
+}
+
+
 
 /// stripRegisterPrefix - This method strips the character prefix from a
 /// register name so that only the number is left.  Used by for linux asm.
index ef6a9a529a1a0bb7ecb2ccc13d139a10f27de6e4..3d67efa027c85951baaa42d1d6afef464474f4b1 100644 (file)
@@ -55,15 +55,17 @@ public:
   void printCallOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
   void printAbsAddrOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
 
-  void printcrbitm(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
+  void printcrbitm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
 
-  void printMemRegImm(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
-  void printMemRegImmShifted(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
-  void printMemRegReg(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
+  void printMemRegImm(const MCInst *MI, unsigned OpNo, raw_ostream &O);
+  void printMemRegImmShifted(const MCInst *MI, unsigned OpNo, raw_ostream &O);
+  void printMemRegReg(const MCInst *MI, unsigned OpNo, raw_ostream &O);
   
   // FIXME: Remove
   void PrintSpecial(const MCInst *MI, raw_ostream &O, const char *Modifier) {}
-  void printSymbolLo(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
+  void printSymbolLo(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
+    printS16ImmOperand(MI, OpNo, O);
+  }
   void printSymbolHi(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
   void printPICLabel(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}
   void printTOCEntryLabel(const MCInst *MI, unsigned OpNo, raw_ostream &O) {}