aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2024-10-29 03:46:04 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2024-10-29 19:54:34 +0000
commit5c12434906d85dde4d44036cfb564fd366d9a1a4 (patch)
tree99458c407a3752d68eac23f8ef6cfd59347dd837 /llvm/lib
parent27ef549af2c2f60d05f38db1ecc7a8ad7294351d (diff)
downloadllvm-5c12434906d85dde4d44036cfb564fd366d9a1a4.zip
llvm-5c12434906d85dde4d44036cfb564fd366d9a1a4.tar.gz
llvm-5c12434906d85dde4d44036cfb564fd366d9a1a4.tar.bz2
[X86] Emit comments explaining the immediate in vfpclass
This makes the assembly a lot more readable at a glance. As an example: ``` vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0) ```
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp
index 587f923..49e8bab 100644
--- a/llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp
+++ b/llvm/lib/Target/X86/MCTargetDesc/X86InstComments.cpp
@@ -40,6 +40,20 @@ using namespace llvm;
CASE_MASK_INS_COMMON(Inst, Suffix, src) \
CASE_MASKZ_INS_COMMON(Inst, Suffix, src)
+#define CASE_FPCLASS_PACKED(Inst, src) \
+ CASE_AVX_INS_COMMON(Inst, Z, r##src) \
+ CASE_AVX_INS_COMMON(Inst, Z256, r##src) \
+ CASE_AVX_INS_COMMON(Inst, Z128, r##src) \
+ CASE_MASK_INS_COMMON(Inst, Z, r##src)
+
+#define CASE_FPCLASS_PACKED_MEM(Inst) \
+ CASE_FPCLASS_PACKED(Inst, m) \
+ CASE_FPCLASS_PACKED(Inst, mb)
+
+#define CASE_FPCLASS_SCALAR(Inst, src) \
+ CASE_AVX_INS_COMMON(Inst, Z, r##src) \
+ CASE_MASK_INS_COMMON(Inst, Z, r##src)
+
#define CASE_PTERNLOG(Inst, src) \
CASE_AVX512_INS_COMMON(Inst, Z, r##src##i) \
CASE_AVX512_INS_COMMON(Inst, Z256, r##src##i) \
@@ -949,6 +963,70 @@ static bool printPTERNLOGComments(const MCInst *MI, raw_ostream &OS,
return true;
}
+static bool printFPCLASSComments(const MCInst *MI, raw_ostream &OS,
+ const MCInstrInfo &MCII) {
+ unsigned NumOperands = MI->getNumOperands();
+ int SrcIdx;
+ switch (MI->getOpcode()) {
+ CASE_FPCLASS_PACKED(FPCLASSPBF16, r)
+ CASE_FPCLASS_PACKED(FPCLASSPH, r)
+ CASE_FPCLASS_PACKED(FPCLASSPS, r)
+ CASE_FPCLASS_PACKED(FPCLASSPD, r)
+ CASE_FPCLASS_SCALAR(FPCLASSSH, r)
+ CASE_FPCLASS_SCALAR(FPCLASSSS, r)
+ CASE_FPCLASS_SCALAR(FPCLASSSD, r) {
+ SrcIdx = NumOperands - 2;
+ break;
+ }
+ CASE_FPCLASS_PACKED_MEM(FPCLASSPBF16)
+ CASE_FPCLASS_PACKED_MEM(FPCLASSPH)
+ CASE_FPCLASS_PACKED_MEM(FPCLASSPS)
+ CASE_FPCLASS_PACKED_MEM(FPCLASSPD)
+ CASE_FPCLASS_SCALAR(FPCLASSSH, m)
+ CASE_FPCLASS_SCALAR(FPCLASSSS, m)
+ CASE_FPCLASS_SCALAR(FPCLASSSD, m) {
+ SrcIdx = -1;
+ break;
+ }
+ default:
+ return false;
+ }
+ StringRef DestName = getRegName(MI->getOperand(0).getReg());
+ StringRef SrcName =
+ SrcIdx != -1 ? getRegName(MI->getOperand(SrcIdx).getReg()) : "mem";
+
+ OS << DestName;
+ printMasking(OS, MI, MCII);
+ OS << " = ";
+
+ uint8_t Categories = MI->getOperand(NumOperands - 1).getImm();
+ if (Categories == 0) {
+ OS << "false";
+ } else {
+ static constexpr StringLiteral CategoryNames[] = {
+ "QuietNaN",
+ "PositiveZero",
+ "NegativeZero",
+ "PositiveInfinity",
+ "NegativeInfinity",
+ "Subnormal",
+ "Negative",
+ "SignalingNaN",
+ };
+ bool Conjoin = false;
+ for (size_t I = 0, E = std::size(CategoryNames); I != E; ++I) {
+ if (Categories & (1 << I)) {
+ if (Conjoin)
+ OS << " | ";
+ Conjoin = true;
+ OS << "is" << CategoryNames[I] << '(' << SrcName << ')';
+ }
+ }
+ }
+ OS << '\n';
+ return true;
+}
+
//===----------------------------------------------------------------------===//
// Top Level Entrypoint
//===----------------------------------------------------------------------===//
@@ -970,6 +1048,9 @@ bool llvm::EmitAnyX86InstComments(const MCInst *MI, raw_ostream &OS,
if (printPTERNLOGComments(MI, OS, MCII))
return true;
+ if (printFPCLASSComments(MI, OS, MCII))
+ return true;
+
switch (MI->getOpcode()) {
default:
// Not an instruction for which we can decode comments.