diff options
author | Chris Lattner <sabre@nondot.org> | 2004-04-13 17:18:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-04-13 17:18:39 +0000 |
commit | 266538350a1a478b5fe053bfda42c0d03e371570 (patch) | |
tree | b8a53803e5391c2ac7019c55958505df238854b0 | |
parent | 5deaa7a73d020beb6bbbb6ec1254871f540f2099 (diff) | |
download | external_llvm-266538350a1a478b5fe053bfda42c0d03e371570.zip external_llvm-266538350a1a478b5fe053bfda42c0d03e371570.tar.gz external_llvm-266538350a1a478b5fe053bfda42c0d03e371570.tar.bz2 |
Add support for the printImplicitDefsBefore flag
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12893 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/X86/Printer.cpp | 34 | ||||
-rw-r--r-- | lib/Target/X86/X86.td | 4 | ||||
-rw-r--r-- | lib/Target/X86/X86AsmPrinter.cpp | 34 | ||||
-rw-r--r-- | lib/Target/X86/X86InstrInfo.h | 7 |
4 files changed, 69 insertions, 10 deletions
diff --git a/lib/Target/X86/Printer.cpp b/lib/Target/X86/Printer.cpp index e2f0684..76968f5 100644 --- a/lib/Target/X86/Printer.cpp +++ b/lib/Target/X86/Printer.cpp @@ -105,6 +105,7 @@ namespace { } void printImplUsesBefore(const TargetInstrDescriptor &Desc); + bool printImplDefsBefore(const TargetInstrDescriptor &Desc); bool printImplUsesAfter(const TargetInstrDescriptor &Desc, const bool LC); bool printImplDefsAfter(const TargetInstrDescriptor &Desc, const bool LC); void printMachineInstruction(const MachineInstr *MI); @@ -544,6 +545,30 @@ void Printer::printImplUsesBefore(const TargetInstrDescriptor &Desc) { } } +/// printImplDefsBefore - Emit the implicit-def registers for the instruction +/// described by DESC, if its PrintImplUsesBefore flag is set. Return true if +/// we printed any registers. +/// +bool Printer::printImplDefsBefore(const TargetInstrDescriptor &Desc) { + bool Printed = false; + const MRegisterInfo &RI = *TM.getRegisterInfo(); + if (Desc.TSFlags & X86II::PrintImplDefsBefore) { + const unsigned *p = Desc.ImplicitDefs; + if (*p) { + O << (Printed ? ", %" : "%") << RI.get (*p).Name; + Printed = true; + ++p; + } + while (*p) { + // Bug Workaround: See note in Printer::doInitialization about %. + O << ", %" << RI.get(*p).Name; + ++p; + } + } + return Printed; +} + + /// printImplUsesAfter - Emit the implicit-use registers for the instruction /// described by DESC, if its PrintImplUsesAfter flag is set. /// @@ -655,22 +680,25 @@ void Printer::printMachineInstruction(const MachineInstr *MI) { case X86II::RawFrm: { - bool LeadingComma = false; - // The accepted forms of Raw instructions are: // 1. nop - No operand required // 2. jmp foo - PC relative displacement operand // 3. call bar - GlobalAddress Operand or External Symbol Operand + // 4. in AL, imm - Immediate operand // assert(MI->getNumOperands() == 0 || (MI->getNumOperands() == 1 && (MI->getOperand(0).isPCRelativeDisp() || MI->getOperand(0).isGlobalAddress() || - MI->getOperand(0).isExternalSymbol())) && + MI->getOperand(0).isExternalSymbol() || + MI->getOperand(0).isImmediate())) && "Illegal raw instruction!"); O << TII.getName(MI->getOpcode()) << " "; + bool LeadingComma = printImplDefsBefore(Desc); + if (MI->getNumOperands() == 1) { + if (LeadingComma) O << ", "; printOp(MI->getOperand(0), true); // Don't print "OFFSET"... LeadingComma = true; } diff --git a/lib/Target/X86/X86.td b/lib/Target/X86/X86.td index 3cb54b6..ac0141b 100644 --- a/lib/Target/X86/X86.td +++ b/lib/Target/X86/X86.td @@ -41,6 +41,7 @@ def X86InstrInfo : InstrInfo { "FPFormBits", "printImplicitUsesAfter", "printImplicitUsesBefore", + "printImplicitDefsBefore", "printImplicitDefsAfter", "Opcode"]; let TSFlagsShifts = [0, @@ -52,7 +53,8 @@ def X86InstrInfo : InstrInfo { 18, 19, 20, - 21]; + 21, + 22]; } def X86 : Target { diff --git a/lib/Target/X86/X86AsmPrinter.cpp b/lib/Target/X86/X86AsmPrinter.cpp index e2f0684..76968f5 100644 --- a/lib/Target/X86/X86AsmPrinter.cpp +++ b/lib/Target/X86/X86AsmPrinter.cpp @@ -105,6 +105,7 @@ namespace { } void printImplUsesBefore(const TargetInstrDescriptor &Desc); + bool printImplDefsBefore(const TargetInstrDescriptor &Desc); bool printImplUsesAfter(const TargetInstrDescriptor &Desc, const bool LC); bool printImplDefsAfter(const TargetInstrDescriptor &Desc, const bool LC); void printMachineInstruction(const MachineInstr *MI); @@ -544,6 +545,30 @@ void Printer::printImplUsesBefore(const TargetInstrDescriptor &Desc) { } } +/// printImplDefsBefore - Emit the implicit-def registers for the instruction +/// described by DESC, if its PrintImplUsesBefore flag is set. Return true if +/// we printed any registers. +/// +bool Printer::printImplDefsBefore(const TargetInstrDescriptor &Desc) { + bool Printed = false; + const MRegisterInfo &RI = *TM.getRegisterInfo(); + if (Desc.TSFlags & X86II::PrintImplDefsBefore) { + const unsigned *p = Desc.ImplicitDefs; + if (*p) { + O << (Printed ? ", %" : "%") << RI.get (*p).Name; + Printed = true; + ++p; + } + while (*p) { + // Bug Workaround: See note in Printer::doInitialization about %. + O << ", %" << RI.get(*p).Name; + ++p; + } + } + return Printed; +} + + /// printImplUsesAfter - Emit the implicit-use registers for the instruction /// described by DESC, if its PrintImplUsesAfter flag is set. /// @@ -655,22 +680,25 @@ void Printer::printMachineInstruction(const MachineInstr *MI) { case X86II::RawFrm: { - bool LeadingComma = false; - // The accepted forms of Raw instructions are: // 1. nop - No operand required // 2. jmp foo - PC relative displacement operand // 3. call bar - GlobalAddress Operand or External Symbol Operand + // 4. in AL, imm - Immediate operand // assert(MI->getNumOperands() == 0 || (MI->getNumOperands() == 1 && (MI->getOperand(0).isPCRelativeDisp() || MI->getOperand(0).isGlobalAddress() || - MI->getOperand(0).isExternalSymbol())) && + MI->getOperand(0).isExternalSymbol() || + MI->getOperand(0).isImmediate())) && "Illegal raw instruction!"); O << TII.getName(MI->getOpcode()) << " "; + bool LeadingComma = printImplDefsBefore(Desc); + if (MI->getNumOperands() == 1) { + if (LeadingComma) O << ", "; printOp(MI->getOperand(0), true); // Don't print "OFFSET"... LeadingComma = true; } diff --git a/lib/Target/X86/X86InstrInfo.h b/lib/Target/X86/X86InstrInfo.h index 90e8d52..cc44d26 100644 --- a/lib/Target/X86/X86InstrInfo.h +++ b/lib/Target/X86/X86InstrInfo.h @@ -171,11 +171,12 @@ namespace X86II { // PrintImplDefsAfter - Print out implicit defs in the assembly output // after the normal operands. - PrintImplDefsAfter = 1 << 20, + PrintImplDefsBefore = 1 << 20, + PrintImplDefsAfter = 1 << 21, - OpcodeShift = 21, + OpcodeShift = 22, OpcodeMask = 0xFF << OpcodeShift, - // Bits 26 -> 31 are unused + // Bits 27 -> 31 are unused }; } |