[llvm] 92723d5 - [RISCV][NFC] Simplify decoding code of disassembler

via llvm-commits llvm-commits at lists.llvm.org
Thu May 25 00:25:02 PDT 2023


Author: wangpc
Date: 2023-05-25T15:24:41+08:00
New Revision: 92723d5a32acefc98a618ebfa47da22002b8e911

URL: https://github.com/llvm/llvm-project/commit/92723d5a32acefc98a618ebfa47da22002b8e911
DIFF: https://github.com/llvm/llvm-project/commit/92723d5a32acefc98a618ebfa47da22002b8e911.diff

LOG: [RISCV][NFC] Simplify decoding code of disassembler

The decoding parts are reduplicative, we add a macro to simplify
the code.

Reviewed By: craig.topper, kito-cheng

Differential Revision: https://reviews.llvm.org/D151309

Added: 
    

Modified: 
    llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
index 4f23edb2edfb7..e10fb7d4b039c 100644
--- a/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
+++ b/llvm/lib/Target/RISCV/Disassembler/RISCVDisassembler.cpp
@@ -490,6 +490,27 @@ DecodeStatus RISCVDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
   uint32_t Insn;
   DecodeStatus Result;
 
+#define TRY_TO_DECODE_WITH_ADDITIONAL_OPERATION(FEATURE_CHECKS, DECODER_TABLE, \
+                                                DESC, ADDITIONAL_OPERATION)    \
+  do {                                                                         \
+    if (FEATURE_CHECKS) {                                                      \
+      LLVM_DEBUG(dbgs() << "Trying " DESC ":\n");                              \
+      Result = decodeInstruction(DECODER_TABLE, MI, Insn, Address, this, STI); \
+      if (Result != MCDisassembler::Fail) {                                    \
+        ADDITIONAL_OPERATION;                                                  \
+        return Result;                                                         \
+      }                                                                        \
+    }                                                                          \
+  } while (false)
+#define TRY_TO_DECODE_AND_ADD_SP(FEATURE_CHECKS, DECODER_TABLE, DESC)          \
+  TRY_TO_DECODE_WITH_ADDITIONAL_OPERATION(FEATURE_CHECKS, DECODER_TABLE, DESC, \
+                                          addSPOperands(MI))
+#define TRY_TO_DECODE(FEATURE_CHECKS, DECODER_TABLE, DESC)                     \
+  TRY_TO_DECODE_WITH_ADDITIONAL_OPERATION(FEATURE_CHECKS, DECODER_TABLE, DESC, \
+                                          (void)nullptr)
+#define TRY_TO_DECODE_FEATURE(FEATURE, DECODER_TABLE, DESC)                    \
+  TRY_TO_DECODE(STI.hasFeature(FEATURE), DECODER_TABLE, DESC)
+
   // It's a 32 bit instruction if bit 0 and 1 are 1.
   if ((Bytes[0] & 0x3) == 0x3) {
     if (Bytes.size() < 4) {
@@ -500,116 +521,46 @@ DecodeStatus RISCVDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
 
     Insn = support::endian::read32le(Bytes.data());
 
-    if (STI.hasFeature(RISCV::FeatureStdExtZdinx) &&
-        !STI.hasFeature(RISCV::Feature64Bit)) {
-      LLVM_DEBUG(dbgs() << "Trying RV32Zdinx table (Double in Integer and"
-                           "rv32)\n");
-      Result = decodeInstruction(DecoderTableRV32Zdinx32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureStdExtZfinx)) {
-      LLVM_DEBUG(dbgs() << "Trying RVZfinx table (Float in Integer):\n");
-      Result = decodeInstruction(DecoderTableRVZfinx32, MI, Insn, Address, this,
-                                 STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXVentanaCondOps)) {
-      LLVM_DEBUG(dbgs() << "Trying Ventana custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableVentana32, MI, Insn, Address, this,
-                                 STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadBa)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadBa custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadBa32, MI, Insn, Address, this,
-                                 STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadBb)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadBb custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadBb32, MI, Insn, Address, this,
-                                 STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadBs)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadBs custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadBs32, MI, Insn, Address, this,
-                                 STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadCondMov)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadCondMov custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadCondMov32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadCmo)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadCmo custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadCmo32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadFMemIdx)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadFMemIdx custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadFMemIdx32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadMac)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadMac custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadMac32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadMemIdx)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadMemIdx custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadMemIdx32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadMemPair)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadMemPair custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadMemPair32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadSync)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadSync custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableTHeadSync32, MI, Insn, Address,
-                                 this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXTHeadVdot)) {
-      LLVM_DEBUG(dbgs() << "Trying XTHeadVdot custom opcode table:\n");
-      Result =
-          decodeInstruction(DecoderTableTHeadV32, MI, Insn, Address, this, STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
-    if (STI.hasFeature(RISCV::FeatureVendorXSfvcp)) {
-      LLVM_DEBUG(dbgs() << "Trying SiFive VCIX custom opcode table:\n");
-      Result = decodeInstruction(DecoderTableXSfvcp32, MI, Insn, Address, this,
-                                 STI);
-      if (Result != MCDisassembler::Fail)
-        return Result;
-    }
+    TRY_TO_DECODE(STI.hasFeature(RISCV::FeatureStdExtZdinx) &&
+                      !STI.hasFeature(RISCV::Feature64Bit),
+                  DecoderTableRV32Zdinx32,
+                  "RV32Zdinx table (Double in Integer and rv32)");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureStdExtZfinx, DecoderTableRVZfinx32,
+                          "RVZfinx table (Float in Integer)");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXVentanaCondOps,
+                          DecoderTableVentana32, "Ventana custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadBa, DecoderTableTHeadBa32,
+                          "XTHeadBa custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadBb, DecoderTableTHeadBb32,
+                          "XTHeadBb custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadBs, DecoderTableTHeadBs32,
+                          "XTHeadBs custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadCondMov,
+                          DecoderTableTHeadCondMov32,
+                          "XTHeadCondMov custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadCmo, DecoderTableTHeadCmo32,
+                          "XTHeadCmo custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadFMemIdx,
+                          DecoderTableTHeadFMemIdx32,
+                          "XTHeadFMemIdx custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadMac, DecoderTableTHeadMac32,
+                          "XTHeadMac custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadMemIdx,
+                          DecoderTableTHeadMemIdx32,
+                          "XTHeadMemIdx custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadMemPair,
+                          DecoderTableTHeadMemPair32,
+                          "XTHeadMemPair custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadSync,
+                          DecoderTableTHeadSync32,
+                          "XTHeadSync custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXTHeadVdot, DecoderTableTHeadV32,
+                          "XTHeadVdot custom opcode table");
+    TRY_TO_DECODE_FEATURE(RISCV::FeatureVendorXSfvcp, DecoderTableXSfvcp32,
+                          "SiFive VCIX custom opcode table");
+    TRY_TO_DECODE(true, DecoderTable32, "RISCV32 table");
 
-    LLVM_DEBUG(dbgs() << "Trying RISCV32 table :\n");
-    return decodeInstruction(DecoderTable32, MI, Insn, Address, this, STI);
+    return MCDisassembler::Fail;
   }
 
   if (Bytes.size() < 2) {
@@ -619,41 +570,16 @@ DecodeStatus RISCVDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
   Size = 2;
 
   Insn = support::endian::read16le(Bytes.data());
-
-  if (!STI.hasFeature(RISCV::Feature64Bit)) {
-    LLVM_DEBUG(
-        dbgs() << "Trying RISCV32Only_16 table (16-bit Instruction):\n");
-    // Calling the auto-generated decoder function.
-    Result = decodeInstruction(DecoderTableRISCV32Only_16, MI, Insn, Address,
-                               this, STI);
-    if (Result != MCDisassembler::Fail) {
-      addSPOperands(MI);
-      return Result;
-    }
-  }
-  if (STI.hasFeature(RISCV::FeatureStdExtZcmt)) {
-    LLVM_DEBUG(
-        dbgs() << "Trying Zcmt table (16-bit Table Jump Instructions):\n");
-    Result = decodeInstruction(DecoderTableRVZcmt16, MI, Insn, Address,
-                               this, STI);
-    if (Result != MCDisassembler::Fail)
-      return Result;
-  }
-  if (STI.hasFeature(RISCV::FeatureStdExtZcmp)) {
-    LLVM_DEBUG(
-        dbgs()
-        << "Trying Zcmp table (16-bit Push/Pop & Double Move Instructions):\n");
-    Result =
-        decodeInstruction(DecoderTableRVZcmp16, MI, Insn, Address, this, STI);
-    if (Result != MCDisassembler::Fail)
-      return Result;
-  }
-
-  LLVM_DEBUG(dbgs() << "Trying RISCV_C table (16-bit Instruction):\n");
-  // Calling the auto-generated decoder function.
-  Result = decodeInstruction(DecoderTable16, MI, Insn, Address, this, STI);
-  if (Result != MCDisassembler::Fail)
-    addSPOperands(MI);
-
-  return Result;
+  TRY_TO_DECODE_AND_ADD_SP(!STI.hasFeature(RISCV::Feature64Bit),
+                           DecoderTableRISCV32Only_16,
+                           "RISCV32Only_16 table (16-bit Instruction)");
+  TRY_TO_DECODE_FEATURE(RISCV::FeatureStdExtZcmt, DecoderTableRVZcmt16,
+                        "Zcmt table (16-bit Table Jump Instructions)");
+  TRY_TO_DECODE_FEATURE(
+      RISCV::FeatureStdExtZcmp, DecoderTableRVZcmp16,
+      "Zcmp table (16-bit Push/Pop & Double Move Instructions)");
+  TRY_TO_DECODE_AND_ADD_SP(true, DecoderTable16,
+                           "RISCV_C table (16-bit Instruction)");
+
+  return MCDisassembler::Fail;
 }


        


More information about the llvm-commits mailing list