forked from OSchip/llvm-project
[x86] Teach the asm comment printing to only print the clarification of
an immediate operand when we don't have instruction-specific comments. This ensures that instruction-specific comments are attached to the same line as the instruction which is important for using them to write readable and maintainable tests. My next commit will just such a test. llvm-svn: 217099
This commit is contained in:
parent
351b078b6d
commit
2317311825
|
@ -45,6 +45,11 @@ void X86ATTInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
|
|||
const MCInstrDesc &Desc = MII.get(MI->getOpcode());
|
||||
uint64_t TSFlags = Desc.TSFlags;
|
||||
|
||||
// If verbose assembly is enabled, we can print some informative comments.
|
||||
if (CommentStream)
|
||||
HasCustomInstComment =
|
||||
EmitAnyX86InstComments(MI, *CommentStream, getRegisterName);
|
||||
|
||||
if (TSFlags & X86II::LOCK)
|
||||
OS << "\tlock\n";
|
||||
|
||||
|
@ -54,10 +59,6 @@ void X86ATTInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
|
|||
|
||||
// Next always print the annotation.
|
||||
printAnnotation(OS, Annot);
|
||||
|
||||
// If verbose assembly is enabled, we can print some informative comments.
|
||||
if (CommentStream)
|
||||
EmitAnyX86InstComments(MI, *CommentStream, getRegisterName);
|
||||
}
|
||||
|
||||
void X86ATTInstPrinter::printSSECC(const MCInst *MI, unsigned Op,
|
||||
|
@ -170,7 +171,11 @@ void X86ATTInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
|
|||
<< '$' << formatImm((int64_t)Op.getImm())
|
||||
<< markup(">");
|
||||
|
||||
if (CommentStream && (Op.getImm() > 255 || Op.getImm() < -256))
|
||||
// If there are no instruction-specific comments, add a comment clarifying
|
||||
// the hex value of the immediate operand when it isn't in the range
|
||||
// [-256,255].
|
||||
if (CommentStream && !HasCustomInstComment &&
|
||||
(Op.getImm() > 255 || Op.getImm() < -256))
|
||||
*CommentStream << format("imm = 0x%" PRIX64 "\n", (uint64_t)Op.getImm());
|
||||
|
||||
} else {
|
||||
|
|
|
@ -129,6 +129,9 @@ public:
|
|||
void printMemOffs64(const MCInst *MI, unsigned OpNo, raw_ostream &O) {
|
||||
printMemOffset(MI, OpNo, O);
|
||||
}
|
||||
|
||||
private:
|
||||
bool HasCustomInstComment;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -28,13 +28,17 @@ using namespace llvm;
|
|||
/// EmitAnyX86InstComments - This function decodes x86 instructions and prints
|
||||
/// newline terminated strings to the specified string if desired. This
|
||||
/// information is shown in disassembly dumps when verbose assembly is enabled.
|
||||
void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
||||
bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
||||
const char *(*getRegName)(unsigned)) {
|
||||
// If this is a shuffle operation, the switch should fill in this state.
|
||||
SmallVector<int, 8> ShuffleMask;
|
||||
const char *DestName = nullptr, *Src1Name = nullptr, *Src2Name = nullptr;
|
||||
|
||||
switch (MI->getOpcode()) {
|
||||
default:
|
||||
// Not an instruction for which we can decode comments.
|
||||
return false;
|
||||
|
||||
case X86::BLENDPDrri:
|
||||
case X86::VBLENDPDrri:
|
||||
Src2Name = getRegName(MI->getOperand(2).getReg());
|
||||
|
@ -553,9 +557,11 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
|||
break;
|
||||
}
|
||||
|
||||
// The only comments we decode are shuffles, so give up if we were unable to
|
||||
// decode a shuffle mask.
|
||||
if (ShuffleMask.empty())
|
||||
return false;
|
||||
|
||||
// If this was a shuffle operation, print the shuffle mask.
|
||||
if (!ShuffleMask.empty()) {
|
||||
if (!DestName) DestName = Src1Name;
|
||||
OS << (DestName ? DestName : "mem") << " = ";
|
||||
|
||||
|
@ -601,6 +607,7 @@ void llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
|||
}
|
||||
//MI->print(OS, 0);
|
||||
OS << "\n";
|
||||
}
|
||||
|
||||
// We successfully added a comment to this instruction.
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
namespace llvm {
|
||||
class MCInst;
|
||||
class raw_ostream;
|
||||
void EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
||||
bool EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
|
||||
const char *(*getRegName)(unsigned));
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue