[llvm-commits] CVS: llvm/lib/Target/X86/Printer.cpp
Chris Lattner
lattner at cs.uiuc.edu
Wed Nov 20 18:31:01 PST 2002
Changes in directory llvm/lib/Target/X86:
Printer.cpp updated: 1.8 -> 1.9
---
Log message:
Print another class of instructions correctly, giving us: xorl EDX, EDX
for example.
---
Diffs of the changes:
Index: llvm/lib/Target/X86/Printer.cpp
diff -u llvm/lib/Target/X86/Printer.cpp:1.8 llvm/lib/Target/X86/Printer.cpp:1.9
--- llvm/lib/Target/X86/Printer.cpp:1.8 Wed Nov 20 12:56:41 2002
+++ llvm/lib/Target/X86/Printer.cpp Wed Nov 20 18:30:01 2002
@@ -97,6 +97,12 @@
}
+static bool isReg(const MachineOperand &MO) {
+ return MO.getType()==MachineOperand::MO_VirtualRegister ||
+ MO.getType()==MachineOperand::MO_MachineRegister;
+}
+
+
// print - Print out an x86 instruction in intel syntax
void X86InstrInfo::print(const MachineInstr *MI, std::ostream &O,
const TargetMachine &TM) const {
@@ -137,20 +143,10 @@
//
// 2 Operands: this is for things like mov that do not read a second input
//
- assert(((MI->getNumOperands() == 3 &&
- (MI->getOperand(0).getType()==MachineOperand::MO_VirtualRegister||
- MI->getOperand(0).getType()==MachineOperand::MO_MachineRegister)
- &&
- (MI->getOperand(1).getType()==MachineOperand::MO_VirtualRegister||
- MI->getOperand(1).getType()==MachineOperand::MO_MachineRegister))
- ||
- (MI->getNumOperands() == 2 &&
- (MI->getOperand(0).getType()==MachineOperand::MO_VirtualRegister||
- MI->getOperand(0).getType()==MachineOperand::MO_MachineRegister)
- && (MI->getOperand(MI->getNumOperands()-1).getType() ==
- MachineOperand::MO_VirtualRegister||
- MI->getOperand(MI->getNumOperands()-1).getType() ==
- MachineOperand::MO_MachineRegister)))
+ assert(isReg(MI->getOperand(0)) &&
+ (MI->getNumOperands() == 2 ||
+ (MI->getNumOperands() == 3 && isReg(MI->getOperand(1)))) &&
+ isReg(MI->getOperand(MI->getNumOperands()-1))
&& "Bad format for MRMDestReg!");
if (MI->getNumOperands() == 3 &&
MI->getOperand(0).getReg() != MI->getOperand(1).getReg())
@@ -163,8 +159,34 @@
printOp(O, MI->getOperand(MI->getNumOperands()-1), RI);
O << "\n";
return;
- case X86II::MRMDestMem:
case X86II::MRMSrcReg:
+ // There is a two forms that are acceptable for MRMSrcReg instructions,
+ // those with 3 and 2 operands:
+ //
+ // 3 Operands: in this form, the last register (the second input) is the
+ // ModR/M input. The first two operands should be the same, post register
+ // allocation. This is for things like: add r32, r/m32
+ //
+ // 2 Operands: this is for things like mov that do not read a second input
+ //
+ assert(isReg(MI->getOperand(0)) &&
+ isReg(MI->getOperand(1)) &&
+ (MI->getNumOperands() == 2 ||
+ (MI->getNumOperands() == 3 && isReg(MI->getOperand(2))))
+ && "Bad format for MRMDestReg!");
+ if (MI->getNumOperands() == 3 &&
+ MI->getOperand(0).getReg() != MI->getOperand(1).getReg())
+ O << "**";
+
+ O << "\t";
+ O << getName(MI->getOpCode()) << " ";
+ printOp(O, MI->getOperand(0), RI);
+ O << ", ";
+ printOp(O, MI->getOperand(MI->getNumOperands()-1), RI);
+ O << "\n";
+ return;
+
+ case X86II::MRMDestMem:
case X86II::MRMSrcMem:
default:
O << "\t-"; MI->print(O, TM); break;
More information about the llvm-commits
mailing list