Give the asmprinter the ability to print memrefs with a constant pool index,
authorChris Lattner <sabre@nondot.org>
Sun, 17 Oct 2004 07:16:32 +0000 (07:16 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 17 Oct 2004 07:16:32 +0000 (07:16 +0000)
index reg and scale

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

lib/Target/X86/X86AsmPrinter.cpp

index 1644e3fa1b5c395da89c529a896fcc4a99e9d20a..0ec55702539191c7d18b1d12f5516513cf014851 100644 (file)
@@ -312,26 +312,34 @@ void X86IntelAsmPrinter::printOp(const MachineOperand &MO,
 void X86IntelAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
   assert(isMem(MI, Op) && "Invalid memory reference!");
 
-  if (MI->getOperand(Op).isFrameIndex()) {
-    O << "[frame slot #" << MI->getOperand(Op).getFrameIndex();
-    if (MI->getOperand(Op+3).getImmedValue())
-      O << " + " << MI->getOperand(Op+3).getImmedValue();
+  const MachineOperand &BaseReg  = MI->getOperand(Op);
+  int ScaleVal                   = MI->getOperand(Op+1).getImmedValue();
+  const MachineOperand &IndexReg = MI->getOperand(Op+2);
+  const MachineOperand &DispSpec = MI->getOperand(Op+3);
+
+  if (BaseReg.isFrameIndex()) {
+    O << "[frame slot #" << BaseReg.getFrameIndex();
+    if (DispSpec.getImmedValue())
+      O << " + " << DispSpec.getImmedValue();
     O << "]";
     return;
-  } else if (MI->getOperand(Op).isConstantPoolIndex()) {
+  } else if (BaseReg.isConstantPoolIndex()) {
     O << "[.CPI" << CurrentFnName << "_"
-      << MI->getOperand(Op).getConstantPoolIndex();
-    if (MI->getOperand(Op+3).getImmedValue())
-      O << " + " << MI->getOperand(Op+3).getImmedValue();
+      << BaseReg.getConstantPoolIndex();
+
+    if (IndexReg.getReg()) {
+      O << " + ";
+      if (ScaleVal != 1)
+        O << ScaleVal << "*";
+      printOp(IndexReg);
+    }
+    
+    if (DispSpec.getImmedValue())
+      O << " + " << DispSpec.getImmedValue();
     O << "]";
     return;
   }
 
-  const MachineOperand &BaseReg  = MI->getOperand(Op);
-  int ScaleVal                   = MI->getOperand(Op+1).getImmedValue();
-  const MachineOperand &IndexReg = MI->getOperand(Op+2);
-  const MachineOperand &DispSpec = MI->getOperand(Op+3);
-
   O << "[";
   bool NeedPlus = false;
   if (BaseReg.getReg()) {
@@ -520,25 +528,32 @@ void X86ATTAsmPrinter::printOp(const MachineOperand &MO, bool isCallOp) {
 void X86ATTAsmPrinter::printMemReference(const MachineInstr *MI, unsigned Op){
   assert(isMem(MI, Op) && "Invalid memory reference!");
 
-  if (MI->getOperand(Op).isFrameIndex()) {
-    O << "[frame slot #" << MI->getOperand(Op).getFrameIndex();
-    if (MI->getOperand(Op+3).getImmedValue())
-      O << " + " << MI->getOperand(Op+3).getImmedValue();
+  const MachineOperand &BaseReg  = MI->getOperand(Op);
+  int ScaleVal                   = MI->getOperand(Op+1).getImmedValue();
+  const MachineOperand &IndexReg = MI->getOperand(Op+2);
+  const MachineOperand &DispSpec = MI->getOperand(Op+3);
+
+  if (BaseReg.isFrameIndex()) {
+    O << "[frame slot #" << BaseReg.getFrameIndex();
+    if (DispSpec.getImmedValue())
+      O << " + " << DispSpec.getImmedValue();
     O << "]";
     return;
-  } else if (MI->getOperand(Op).isConstantPoolIndex()) {
+  } else if (BaseReg.isConstantPoolIndex()) {
     O << ".CPI" << CurrentFnName << "_"
-      << MI->getOperand(Op).getConstantPoolIndex();
-    if (MI->getOperand(Op+3).getImmedValue())
-      O << " + " << MI->getOperand(Op+3).getImmedValue();
+      << BaseReg.getConstantPoolIndex();
+    if (DispSpec.getImmedValue())
+      O << "+" << DispSpec.getImmedValue();
+    if (IndexReg.getReg()) {
+      O << "(,";
+      printOp(IndexReg);
+      if (ScaleVal != 1)
+        O << "," << ScaleVal;
+      O << ")";
+    }
     return;
   }
 
-  const MachineOperand &BaseReg  = MI->getOperand(Op);
-  int ScaleVal                   = MI->getOperand(Op+1).getImmedValue();
-  const MachineOperand &IndexReg = MI->getOperand(Op+2);
-  const MachineOperand &DispSpec = MI->getOperand(Op+3);
-
   if (DispSpec.isGlobalAddress()) {
     printOp(DispSpec, true);
   } else {