mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Fix some column padding bugs, reorganize things as suggested by Chris
and eliminate complexity. Yay! llvm-svn: 78243
This commit is contained in:
parent
8a74485e06
commit
af3c172859
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user