OSDN Git Service

wire up a few more things, down to 4 test failures, all
authorChris Lattner <sabre@nondot.org>
Sun, 14 Nov 2010 21:51:37 +0000 (21:51 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 14 Nov 2010 21:51:37 +0000 (21:51 +0000)
about handling $stub, lo/hi etc.

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

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

index 8a10c0f..607eb4f 100644 (file)
 
 #define DEBUG_TYPE "asm-printer"
 #include "PPCInstPrinter.h"
+#include "PPCPredicates.h"
 #include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCInst.h"
 //#include "llvm/MC/MCAsmInfo.h"
 //#include "llvm/ADT/StringExtras.h"
 #include "llvm/Support/raw_ostream.h"
-
-#include "PPCGenRegisterNames.inc"
-#include "PPCGenInstrNames.inc"
 using namespace llvm;
 
 #define GET_INSTRUCTION_NAME
@@ -84,6 +82,34 @@ void PPCInstPrinter::printInst(const MCInst *MI, raw_ostream &O) {
   printInstruction(MI, O);
 }
 
+
+void PPCInstPrinter::printPredicateOperand(const MCInst *MI, unsigned OpNo,
+                                           raw_ostream &O, 
+                                           const char *Modifier) {
+  assert(Modifier && "Must specify 'cc' or 'reg' as predicate op modifier!");
+  unsigned Code = MI->getOperand(OpNo).getImm();
+  if (StringRef(Modifier) == "cc") {
+    switch ((PPC::Predicate)Code) {
+    default: assert(0 && "Invalid predicate");
+    case PPC::PRED_ALWAYS: return; // Don't print anything for always.
+    case PPC::PRED_LT: O << "lt"; return;
+    case PPC::PRED_LE: O << "le"; return;
+    case PPC::PRED_EQ: O << "eq"; return;
+    case PPC::PRED_GE: O << "ge"; return;
+    case PPC::PRED_GT: O << "gt"; return;
+    case PPC::PRED_NE: O << "ne"; return;
+    case PPC::PRED_UN: O << "un"; return;
+    case PPC::PRED_NU: O << "nu"; return;
+    }
+  }
+  
+  assert(StringRef(Modifier) == "reg" &&
+         "Need to specify 'cc' or 'reg' as predicate op modifier!");
+  // Don't print the register for 'always'.
+  if (Code == PPC::PRED_ALWAYS) return;
+  printOperand(MI, OpNo+1, O);
+}
+
 void PPCInstPrinter::printS5ImmOperand(const MCInst *MI, unsigned OpNo,
                                        raw_ostream &O) {
   char Value = MI->getOperand(OpNo).getImm();
@@ -117,20 +143,10 @@ void PPCInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
 
 void PPCInstPrinter::printS16X4ImmOperand(const MCInst *MI, unsigned OpNo,
                                           raw_ostream &O) {
-  if (MI->getOperand(OpNo).isImm()) {
+  if (MI->getOperand(OpNo).isImm())
     O << (short)(MI->getOperand(OpNo).getImm()*4);
-    return;
-  }
-  
-  assert(0 && "Unhandled operand");
-#if 0
-  O << "lo16(";
-  printOp(MI->getOperand(OpNo), O);
-  if (TM.getRelocationModel() == Reloc::PIC_)
-    O << "-\"L" << getFunctionNumber() << "$pb\")";
   else
-    O << ')';
-#endif
+    printOperand(MI, OpNo, O);
 }
 
 void PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo,
@@ -140,10 +156,14 @@ void PPCInstPrinter::printBranchOperand(const MCInst *MI, unsigned OpNo,
 
   // Branches can take an immediate operand.  This is used by the branch
   // selection pass to print $+8, an eight byte displacement from the PC.
-  O << "$+" << MI->getOperand(OpNo).getImm()*4;
+  O << "$+";
+  printAbsAddrOperand(MI, OpNo, O);
 }
 
-
+void PPCInstPrinter::printAbsAddrOperand(const MCInst *MI, unsigned OpNo,
+                                         raw_ostream &O) {
+  O << (int)MI->getOperand(OpNo).getImm()*4;
+}
 
 
 void PPCInstPrinter::printcrbitm(const MCInst *MI, unsigned OpNo,
index b73f1eb..b29a2f4 100644 (file)
@@ -42,7 +42,7 @@ public:
 
   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
   void printPredicateOperand(const MCInst *MI, unsigned OpNo,
-                             raw_ostream &O, const char *Modifier) {}
+                             raw_ostream &O, const char *Modifier);
 
 
   void printS5ImmOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
@@ -55,7 +55,7 @@ public:
   void printCallOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
     printOperand(MI, OpNo, O);
   }
-  void printAbsAddrOperand(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);