aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/AsmPrinter.h6
-rw-r--r--include/llvm/Target/TargetAsmInfo.h7
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp18
-rw-r--r--utils/TableGen/AsmWriterEmitter.cpp30
4 files changed, 31 insertions, 30 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h
index 847c945..0ab780b 100644
--- a/include/llvm/CodeGen/AsmPrinter.h
+++ b/include/llvm/CodeGen/AsmPrinter.h
@@ -327,6 +327,12 @@ namespace llvm {
void EmitComments(const MCInst &MI) const;
protected:
+ /// getOperandColumn - Return the output column number (zero-based)
+ /// for operand % "operand." If TargetAsmInfo has FirstOperandColumn
+ /// == 0 or MaxOperandLength == 0, return 0, meaning column alignment
+ /// is disabled.
+ unsigned getOperandColumn(int operand) const;
+
/// PadToColumn - This gets called every time a tab is emitted. If
/// column padding is turned on, we replace the tab with the
/// appropriate amount of padding. If not, we replace the tab with a
diff --git a/include/llvm/Target/TargetAsmInfo.h b/include/llvm/Target/TargetAsmInfo.h
index e24302b..b5c1796 100644
--- a/include/llvm/Target/TargetAsmInfo.h
+++ b/include/llvm/Target/TargetAsmInfo.h
@@ -361,8 +361,11 @@ namespace llvm {
const char *getCommentString() const {
return CommentString;
}
- unsigned getOperandColumn(int operand) const {
- return FirstOperandColumn + (MaxOperandLength+1)*(operand-1);
+ unsigned getFirstOperandColumn() const {
+ return FirstOperandColumn;
+ }
+ unsigned getMaxOperandLength() const {
+ return MaxOperandLength;
}
const char *getGlobalPrefix() const {
return GlobalPrefix;
diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 3102bda..ec62822 100644
--- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -782,6 +782,20 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
}
O << '\n';
}
+
+/// getOperandColumn - Return the output column number (zero-based)
+/// for operand % "operand." If TargetAsmInfo has FirstOperandColumn
+/// == 0 or MaxOperandLength == 0, return 0, meaning column alignment
+/// is disabled.
+unsigned AsmPrinter::getOperandColumn(int operand) const {
+ if (TAI->getFirstOperandColumn() > 0 && TAI->getMaxOperandLength() > 0) {
+ return TAI->getFirstOperandColumn()
+ + (TAI->getMaxOperandLength()+1)*(operand-1);
+ }
+ else {
+ return 0;
+ }
+}
/// PadToColumn - This gets called every time a tab is emitted. If
/// column padding is turned on, we replace the tab with the
@@ -789,8 +803,8 @@ void AsmPrinter::EmitAlignment(unsigned NumBits, const GlobalValue *GV,
/// space, except for the first operand so that initial operands are
/// always lined up by tabs.
void AsmPrinter::PadToColumn(unsigned Operand) const {
- if (TAI->getOperandColumn(Operand) > 0) {
- O.PadToColumn(TAI->getOperandColumn(Operand), 1);
+ if (getOperandColumn(Operand) > 0) {
+ O.PadToColumn(getOperandColumn(Operand), 1);
}
else {
if (Operand == 1) {
diff --git a/utils/TableGen/AsmWriterEmitter.cpp b/utils/TableGen/AsmWriterEmitter.cpp
index 5f1d325..de4ec22 100644
--- a/utils/TableGen/AsmWriterEmitter.cpp
+++ b/utils/TableGen/AsmWriterEmitter.cpp
@@ -148,8 +148,6 @@ AsmWriterInst::AsmWriterInst(const CodeGenInstruction &CGI, unsigned Variant) {
// Emit a constant string fragment.
- // TODO: Recognize an operand separator to determine when to pad
- // to the next operator.
if (DollarPos != LastEmitted) {
if (CurVariant == Variant || CurVariant == ~0U) {
for (; LastEmitted != DollarPos; ++LastEmitted)
@@ -727,30 +725,10 @@ void AsmWriterEmitter::run(raw_ostream &O) {
O << " // Emit the opcode for the instruction.\n"
<< " unsigned Bits = OpInfo[MI->getOpcode()];\n"
- << " if (Bits == 0) return false;\n\n";
-
- O << " unsigned OperandColumn = 1;\n\n"
- << " if (TAI->getOperandColumn(1) > 0) {\n"
- << " // Don't emit trailing whitespace, let the column padding do it. This\n"
- << " // guarantees that a stray long opcode + tab won't upset the alignment.\n"
- << " // We need to handle this special case here because sometimes the initial\n"
- << " // mnemonic string includes a tab or space and sometimes it doesn't.\n"
- << " unsigned OpLength = std::strlen(AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "));\n"
- << " if (OpLength > 0 &&\n"
- << " ((AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == ' ' ||\n"
- << " (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == '\\t')) {\n"
- << " do {\n"
- << " --OpLength;\n"
- << " } while ((AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == ' ' ||\n"
- << " (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[OpLength-1] == '\\t');\n"
- << " for (unsigned Idx = 0; Idx < OpLength; ++Idx)\n"
- << " O << (AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << "))[Idx];\n"
- << " O.PadToColumn(TAI->getOperandColumn(OperandColumn++), 1);\n"
- << " }\n"
- << " } else {\n"
- << " O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n"
- << " }\n\n";
-
+ << " if (Bits == 0) return false;\n"
+ << " O << AsmStrs+(Bits & " << (1 << AsmStrBits)-1 << ");\n\n";
+
+ O << " unsigned OperandColumn = 1;\n\n";
// Output the table driven operand information.
BitsLeft = 32-AsmStrBits;