diff --git a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
index ba70bf8..a2e6315 100644
--- a/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
+++ b/lib/Target/X86/AsmPrinter/X86ATTAsmPrinter.cpp
@@ -917,12 +917,6 @@
       // Handle the 'subreg rewriting' for the lea64_32mem operand.
       lower_lea64_32mem(&TmpInst, 1);
       break;
-    case X86::CALL64pcrel32:
-    case X86::CALLpcrel32:
-    case X86::TAILJMPd:
-      // The target operand is pc-relative, not an absolute reference.
-      // FIXME: this should be an operand property, not an asm format modifier.
-      ;   
     }
     
     // FIXME: Convert TmpInst.
diff --git a/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp b/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp
index d6545d6..9d50edc 100644
--- a/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp
+++ b/lib/Target/X86/AsmPrinter/X86ATTInstPrinter.cpp
@@ -83,274 +83,13 @@
     O << TRI->getAsmName(Reg);
     return;
   } else if (Op.isImm()) {
-    //if (!Modifier || (strcmp(Modifier, "debug") && strcmp(Modifier, "mem") &&
-    // strcmp(Modifier, "call")))
+    //if (!Modifier || (strcmp(Modifier, "debug") && strcmp(Modifier, "mem")))
     O << '$';
     O << Op.getImm();
     return;
   }
   
   O << "<<UNKNOWN OPERAND KIND>>";
-  
-  
-#if 0
-  const MachineOperand &MO = MI->getOperand(OpNo);
-  switch (MO.getType()) {
-    case MachineOperand::MO_Register: {
-      assert(TargetRegisterInfo::isPhysicalRegister(MO.getReg()) &&
-             "Virtual registers should not make it this far!");
-      O << '%';
-      unsigned Reg = MO.getReg();
-      if (Modifier && strncmp(Modifier, "subreg", strlen("subreg")) == 0) {
-        MVT VT = (strcmp(Modifier+6,"64") == 0) ?
-        MVT::i64 : ((strcmp(Modifier+6, "32") == 0) ? MVT::i32 :
-                    ((strcmp(Modifier+6,"16") == 0) ? MVT::i16 : MVT::i8));
-        Reg = getX86SubSuperRegister(Reg, VT);
-      }
-      O << TRI->getAsmName(Reg);
-      return;
-    }
-      
-    case MachineOperand::MO_Immediate:
-      if (!Modifier || (strcmp(Modifier, "debug") &&
-                        strcmp(Modifier, "mem") &&
-                        strcmp(Modifier, "call")))
-        O << '$';
-      O << MO.getImm();
-      return;
-    case MachineOperand::MO_JumpTableIndex: {
-      bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-      if (!isMemOp) O << '$';
-      O << TAI->getPrivateGlobalPrefix() << "JTI" << getFunctionNumber() << '_'
-      << MO.getIndex();
-      
-      if (TM.getRelocationModel() == Reloc::PIC_) {
-        if (Subtarget->isPICStyleStub())
-          O << "-\"" << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
-          << "$pb\"";
-        else if (Subtarget->isPICStyleGOT())
-          O << "@GOTOFF";
-      }
-      
-      if (isMemOp && Subtarget->isPICStyleRIPRel() && !NotRIPRel)
-        O << "(%rip)";
-      return;
-    }
-    case MachineOperand::MO_ConstantPoolIndex: {
-      bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-      if (!isMemOp) O << '$';
-      O << TAI->getPrivateGlobalPrefix() << "CPI" << getFunctionNumber() << '_'
-      << MO.getIndex();
-      
-      if (TM.getRelocationModel() == Reloc::PIC_) {
-        if (Subtarget->isPICStyleStub())
-          O << "-\"" << TAI->getPrivateGlobalPrefix() << getFunctionNumber()
-          << "$pb\"";
-        else if (Subtarget->isPICStyleGOT())
-          O << "@GOTOFF";
-      }
-      
-      printOffset(MO.getOffset());
-      
-      if (isMemOp && Subtarget->isPICStyleRIPRel() && !NotRIPRel)
-        O << "(%rip)";
-      return;
-    }
-    case MachineOperand::MO_GlobalAddress: {
-      bool isCallOp = Modifier && !strcmp(Modifier, "call");
-      bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-      bool needCloseParen = false;
-      
-      const GlobalValue *GV = MO.getGlobal();
-      const GlobalVariable *GVar = dyn_cast<GlobalVariable>(GV);
-      if (!GVar) {
-        // If GV is an alias then use the aliasee for determining
-        // thread-localness.
-        if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
-          GVar = dyn_cast_or_null<GlobalVariable>(GA->resolveAliasedGlobal(false));
-      }
-      
-      bool isThreadLocal = GVar && GVar->isThreadLocal();
-      
-      std::string Name = Mang->getValueName(GV);
-      decorateName(Name, GV);
-      
-      if (!isMemOp && !isCallOp)
-        O << '$';
-      else if (Name[0] == '$') {
-        // The name begins with a dollar-sign. In order to avoid having it look
-        // like an integer immediate to the assembler, enclose it in parens.
-        O << '(';
-        needCloseParen = true;
-      }
-      
-      if (shouldPrintStub(TM, Subtarget)) {
-        // Link-once, declaration, or Weakly-linked global variables need
-        // non-lazily-resolved stubs
-        if (GV->isDeclaration() || GV->isWeakForLinker()) {
-          // Dynamically-resolved functions need a stub for the function.
-          if (isCallOp && isa<Function>(GV)) {
-            // Function stubs are no longer needed for Mac OS X 10.5 and up.
-            if (Subtarget->isTargetDarwin() && Subtarget->getDarwinVers() >= 9) {
-              O << Name;
-            } else {
-              FnStubs.insert(Name);
-              printSuffixedName(Name, "$stub");
-            }
-          } else if (GV->hasHiddenVisibility()) {
-            if (!GV->isDeclaration() && !GV->hasCommonLinkage())
-              // Definition is not definitely in the current translation unit.
-              O << Name;
-            else {
-              HiddenGVStubs.insert(Name);
-              printSuffixedName(Name, "$non_lazy_ptr");
-            }
-          } else {
-            GVStubs.insert(Name);
-            printSuffixedName(Name, "$non_lazy_ptr");
-          }
-        } else {
-          if (GV->hasDLLImportLinkage())
-            O << "__imp_";
-          O << Name;
-        }
-        
-        if (!isCallOp && TM.getRelocationModel() == Reloc::PIC_)
-          O << '-' << getPICLabelString(getFunctionNumber(), TAI, Subtarget);
-      } else {
-        if (GV->hasDLLImportLinkage()) {
-          O << "__imp_";
-        }
-        O << Name;
-        
-        if (isCallOp) {
-          if (shouldPrintPLT(TM, Subtarget)) {
-            // Assemble call via PLT for externally visible symbols
-            if (!GV->hasHiddenVisibility() && !GV->hasProtectedVisibility() &&
-                !GV->hasLocalLinkage())
-              O << "@PLT";
-          }
-          if (Subtarget->isTargetCygMing() && GV->isDeclaration())
-            // Save function name for later type emission
-            FnStubs.insert(Name);
-        }
-      }
-      
-      if (GV->hasExternalWeakLinkage())
-        ExtWeakSymbols.insert(GV);
-      
-      printOffset(MO.getOffset());
-      
-      if (isThreadLocal) {
-        TLSModel::Model model = getTLSModel(GVar, TM.getRelocationModel());
-        switch (model) {
-          case TLSModel::GeneralDynamic:
-            O << "@TLSGD";
-            break;
-          case TLSModel::LocalDynamic:
-            // O << "@TLSLD"; // local dynamic not implemented
-            O << "@TLSGD";
-            break;
-          case TLSModel::InitialExec:
-            if (Subtarget->is64Bit()) {
-              assert (!NotRIPRel);
-              O << "@GOTTPOFF(%rip)";
-            } else {
-              O << "@INDNTPOFF";
-            }
-            break;
-          case TLSModel::LocalExec:
-            if (Subtarget->is64Bit())
-              O << "@TPOFF";
-            else
-              O << "@NTPOFF";
-            break;
-          default:
-            assert (0 && "Unknown TLS model");
-        }
-      } else if (isMemOp) {
-        if (shouldPrintGOT(TM, Subtarget)) {
-          if (Subtarget->GVRequiresExtraLoad(GV, TM, false))
-            O << "@GOT";
-          else
-            O << "@GOTOFF";
-        } else if (Subtarget->isPICStyleRIPRel() && !NotRIPRel) {
-          if (TM.getRelocationModel() != Reloc::Static) {
-            if (Subtarget->GVRequiresExtraLoad(GV, TM, false))
-              O << "@GOTPCREL";
-            
-            if (needCloseParen) {
-              needCloseParen = false;
-              O << ')';
-            }
-          }
-          
-          // Use rip when possible to reduce code size, except when
-          // index or base register are also part of the address. e.g.
-          // foo(%rip)(%rcx,%rax,4) is not legal
-          O << "(%rip)";
-        }
-      }
-      
-      if (needCloseParen)
-        O << ')';
-      
-      return;
-    }
-    case MachineOperand::MO_ExternalSymbol: {
-      bool isCallOp = Modifier && !strcmp(Modifier, "call");
-      bool isMemOp  = Modifier && !strcmp(Modifier, "mem");
-      bool needCloseParen = false;
-      std::string Name(TAI->getGlobalPrefix());
-      Name += MO.getSymbolName();
-      // Print function stub suffix unless it's Mac OS X 10.5 and up.
-      if (isCallOp && shouldPrintStub(TM, Subtarget) && 
-          !(Subtarget->isTargetDarwin() && Subtarget->getDarwinVers() >= 9)) {
-        FnStubs.insert(Name);
-        printSuffixedName(Name, "$stub");
-        return;
-      }
-      if (!isMemOp && !isCallOp)
-        O << '$';
-      else if (Name[0] == '$') {
-        // The name begins with a dollar-sign. In order to avoid having it look
-        // like an integer immediate to the assembler, enclose it in parens.
-        O << '(';
-        needCloseParen = true;
-      }
-      
-      O << Name;
-      
-      if (shouldPrintPLT(TM, Subtarget)) {
-        std::string GOTName(TAI->getGlobalPrefix());
-        GOTName+="_GLOBAL_OFFSET_TABLE_";
-        if (Name == GOTName)
-          // HACK! Emit extra offset to PC during printing GOT offset to
-          // compensate for the size of popl instruction. The resulting code
-          // should look like:
-          //   call .piclabel
-          // piclabel:
-          //   popl %some_register
-          //   addl $_GLOBAL_ADDRESS_TABLE_ + [.-piclabel], %some_register
-          O << " + [.-"
-          << getPICLabelString(getFunctionNumber(), TAI, Subtarget) << ']';
-        
-        if (isCallOp)
-          O << "@PLT";
-      }
-      
-      if (needCloseParen)
-        O << ')';
-      
-      if (!isCallOp && Subtarget->isPICStyleRIPRel())
-        O << "(%rip)";
-      
-      return;
-    }
-    default:
-      O << "<unknown operand type>"; return;
-  }
-#endif
 }
 
 void X86ATTAsmPrinter::printLeaMemReference(const MCInst *MI, unsigned Op) {
