aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-04-13 17:18:39 +0000
committerChris Lattner <sabre@nondot.org>2004-04-13 17:18:39 +0000
commit266538350a1a478b5fe053bfda42c0d03e371570 (patch)
treeb8a53803e5391c2ac7019c55958505df238854b0
parent5deaa7a73d020beb6bbbb6ec1254871f540f2099 (diff)
downloadexternal_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.cpp34
-rw-r--r--lib/Target/X86/X86.td4
-rw-r--r--lib/Target/X86/X86AsmPrinter.cpp34
-rw-r--r--lib/Target/X86/X86InstrInfo.h7
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
};
}