Skip to content

[NFC][TableGen][X86] Use StringSwitch to map from string -> enum #139929

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 15, 2025

Conversation

jurahul
Copy link
Contributor

@jurahul jurahul commented May 14, 2025

Use StringSwitch instead of macro to map from a string to enum values in X86RecognizableInstr.cpp.

jurahul added 2 commits May 14, 2025 09:36
Use StringSwitch instead of macro to map from a string to enum
values in X86RecognizableInstr.cpp.
@jurahul jurahul marked this pull request as ready for review May 14, 2025 19:52
@llvmbot
Copy link
Member

llvmbot commented May 14, 2025

@llvm/pr-subscribers-backend-x86

@llvm/pr-subscribers-tablegen

Author: Rahul Joshi (jurahul)

Changes

Use StringSwitch instead of macro to map from a string to enum values in X86RecognizableInstr.cpp.


Patch is 34.90 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/139929.diff

1 Files Affected:

  • (modified) llvm/utils/TableGen/X86RecognizableInstr.cpp (+395-352)
diff --git a/llvm/utils/TableGen/X86RecognizableInstr.cpp b/llvm/utils/TableGen/X86RecognizableInstr.cpp
index 506995d26d660..f93e5fbcc4c27 100644
--- a/llvm/utils/TableGen/X86RecognizableInstr.cpp
+++ b/llvm/utils/TableGen/X86RecognizableInstr.cpp
@@ -17,6 +17,7 @@
 #include "X86DisassemblerShared.h"
 #include "X86DisassemblerTables.h"
 #include "X86ModRMFilters.h"
+#include "llvm/ADT/StringSwitch.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/TableGen/Record.h"
 #include <string>
@@ -1020,280 +1021,292 @@ void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const {
 #undef MAP
 }
 
-#define TYPE(Expected, Type)                                                   \
-  if (Str == Expected)                                                         \
-    return Type;
-
 OperandType RecognizableInstr::typeFromString(StringRef Str, bool hasREX_W,
                                               uint8_t OpSize) {
+  StringSwitch<OperandType> Switch(Str);
   if (hasREX_W) {
     // For instructions with a REX_W prefix, a declared 32-bit register encoding
     // is special.
-    TYPE("GR32", TYPE_R32)
+    Switch.Case("GR32", TYPE_R32);
   }
   if (OpSize == X86Local::OpSize16) {
     // For OpSize16 instructions, a declared 16-bit register or
     // immediate encoding is special.
-    TYPE("GR16", TYPE_Rv)
+    Switch.Case("GR16", TYPE_Rv);
   } else if (OpSize == X86Local::OpSize32) {
     // For OpSize32 instructions, a declared 32-bit register or
     // immediate encoding is special.
-    TYPE("GR32", TYPE_Rv)
+    Switch.Case("GR32", TYPE_Rv);
   }
-  TYPE("i16mem", TYPE_M)
-  TYPE("i16imm", TYPE_IMM)
-  TYPE("i16i8imm", TYPE_IMM)
-  TYPE("GR16", TYPE_R16)
-  TYPE("GR16orGR32orGR64", TYPE_R16)
-  TYPE("i32mem", TYPE_M)
-  TYPE("i32imm", TYPE_IMM)
-  TYPE("i32i8imm", TYPE_IMM)
-  TYPE("GR32", TYPE_R32)
-  TYPE("GR32orGR64", TYPE_R32)
-  TYPE("i64mem", TYPE_M)
-  TYPE("i64i32imm", TYPE_IMM)
-  TYPE("i64i8imm", TYPE_IMM)
-  TYPE("GR64", TYPE_R64)
-  TYPE("i8mem", TYPE_M)
-  TYPE("i8imm", TYPE_IMM)
-  TYPE("u4imm", TYPE_UIMM8)
-  TYPE("u8imm", TYPE_UIMM8)
-  TYPE("i16u8imm", TYPE_UIMM8)
-  TYPE("i32u8imm", TYPE_UIMM8)
-  TYPE("i64u8imm", TYPE_UIMM8)
-  TYPE("GR8", TYPE_R8)
-  TYPE("VR128", TYPE_XMM)
-  TYPE("VR128X", TYPE_XMM)
-  TYPE("f128mem", TYPE_M)
-  TYPE("f256mem", TYPE_M)
-  TYPE("f512mem", TYPE_M)
-  TYPE("FR128", TYPE_XMM)
-  TYPE("FR64", TYPE_XMM)
-  TYPE("FR64X", TYPE_XMM)
-  TYPE("f64mem", TYPE_M)
-  TYPE("sdmem", TYPE_M)
-  TYPE("FR16X", TYPE_XMM)
-  TYPE("FR32", TYPE_XMM)
-  TYPE("FR32X", TYPE_XMM)
-  TYPE("f32mem", TYPE_M)
-  TYPE("f16mem", TYPE_M)
-  TYPE("ssmem", TYPE_M)
-  TYPE("shmem", TYPE_M)
-  TYPE("RST", TYPE_ST)
-  TYPE("RSTi", TYPE_ST)
-  TYPE("i128mem", TYPE_M)
-  TYPE("i256mem", TYPE_M)
-  TYPE("i512mem", TYPE_M)
-  TYPE("i512mem_GR16", TYPE_M)
-  TYPE("i512mem_GR32", TYPE_M)
-  TYPE("i512mem_GR64", TYPE_M)
-  TYPE("i64i32imm_brtarget", TYPE_REL)
-  TYPE("i8imm_brtarget", TYPE_REL)
-  TYPE("i16imm_brtarget", TYPE_REL)
-  TYPE("i32imm_brtarget", TYPE_REL)
-  TYPE("ccode", TYPE_IMM)
-  TYPE("cflags", TYPE_IMM)
-  TYPE("AVX512RC", TYPE_IMM)
-  TYPE("brtarget32", TYPE_REL)
-  TYPE("brtarget16", TYPE_REL)
-  TYPE("brtarget8", TYPE_REL)
-  TYPE("f80mem", TYPE_M)
-  TYPE("lea64_8mem", TYPE_M)
-  TYPE("lea64_16mem", TYPE_M)
-  TYPE("lea64_32mem", TYPE_M)
-  TYPE("lea64mem", TYPE_M)
-  TYPE("VR64", TYPE_MM64)
-  TYPE("i64imm", TYPE_IMM)
-  TYPE("anymem", TYPE_M)
-  TYPE("opaquemem", TYPE_M)
-  TYPE("sibmem", TYPE_MSIB)
-  TYPE("SEGMENT_REG", TYPE_SEGMENTREG)
-  TYPE("DEBUG_REG", TYPE_DEBUGREG)
-  TYPE("CONTROL_REG", TYPE_CONTROLREG)
-  TYPE("srcidx8", TYPE_SRCIDX)
-  TYPE("srcidx16", TYPE_SRCIDX)
-  TYPE("srcidx32", TYPE_SRCIDX)
-  TYPE("srcidx64", TYPE_SRCIDX)
-  TYPE("dstidx8", TYPE_DSTIDX)
-  TYPE("dstidx16", TYPE_DSTIDX)
-  TYPE("dstidx32", TYPE_DSTIDX)
-  TYPE("dstidx64", TYPE_DSTIDX)
-  TYPE("offset16_8", TYPE_MOFFS)
-  TYPE("offset16_16", TYPE_MOFFS)
-  TYPE("offset16_32", TYPE_MOFFS)
-  TYPE("offset32_8", TYPE_MOFFS)
-  TYPE("offset32_16", TYPE_MOFFS)
-  TYPE("offset32_32", TYPE_MOFFS)
-  TYPE("offset32_64", TYPE_MOFFS)
-  TYPE("offset64_8", TYPE_MOFFS)
-  TYPE("offset64_16", TYPE_MOFFS)
-  TYPE("offset64_32", TYPE_MOFFS)
-  TYPE("offset64_64", TYPE_MOFFS)
-  TYPE("VR256", TYPE_YMM)
-  TYPE("VR256X", TYPE_YMM)
-  TYPE("VR512", TYPE_ZMM)
-  TYPE("VK1", TYPE_VK)
-  TYPE("VK1WM", TYPE_VK)
-  TYPE("VK2", TYPE_VK)
-  TYPE("VK2WM", TYPE_VK)
-  TYPE("VK4", TYPE_VK)
-  TYPE("VK4WM", TYPE_VK)
-  TYPE("VK8", TYPE_VK)
-  TYPE("VK8WM", TYPE_VK)
-  TYPE("VK16", TYPE_VK)
-  TYPE("VK16WM", TYPE_VK)
-  TYPE("VK32", TYPE_VK)
-  TYPE("VK32WM", TYPE_VK)
-  TYPE("VK64", TYPE_VK)
-  TYPE("VK64WM", TYPE_VK)
-  TYPE("VK1Pair", TYPE_VK_PAIR)
-  TYPE("VK2Pair", TYPE_VK_PAIR)
-  TYPE("VK4Pair", TYPE_VK_PAIR)
-  TYPE("VK8Pair", TYPE_VK_PAIR)
-  TYPE("VK16Pair", TYPE_VK_PAIR)
-  TYPE("vx32mem", TYPE_MVSIBX)
-  TYPE("vx64mem", TYPE_MVSIBX)
-  TYPE("vy32mem", TYPE_MVSIBY)
-  TYPE("vy64mem", TYPE_MVSIBY)
-  TYPE("vx32xmem", TYPE_MVSIBX)
-  TYPE("vx64xmem", TYPE_MVSIBX)
-  TYPE("vy32xmem", TYPE_MVSIBY)
-  TYPE("vy64xmem", TYPE_MVSIBY)
-  TYPE("vz32mem", TYPE_MVSIBZ)
-  TYPE("vz64mem", TYPE_MVSIBZ)
-  TYPE("BNDR", TYPE_BNDR)
-  TYPE("TILE", TYPE_TMM)
-  TYPE("TILEPair", TYPE_TMM_PAIR)
+  OperandType Type = Switch.Case("i16mem", TYPE_M)
+                         .Case("i16imm", TYPE_IMM)
+                         .Case("i16i8imm", TYPE_IMM)
+                         .Case("GR16", TYPE_R16)
+                         .Case("GR16orGR32orGR64", TYPE_R16)
+                         .Case("i32mem", TYPE_M)
+                         .Case("i32imm", TYPE_IMM)
+                         .Case("i32i8imm", TYPE_IMM)
+                         .Case("GR32", TYPE_R32)
+                         .Case("GR32orGR64", TYPE_R32)
+                         .Case("i64mem", TYPE_M)
+                         .Case("i64i32imm", TYPE_IMM)
+                         .Case("i64i8imm", TYPE_IMM)
+                         .Case("GR64", TYPE_R64)
+                         .Case("i8mem", TYPE_M)
+                         .Case("i8imm", TYPE_IMM)
+                         .Case("u4imm", TYPE_UIMM8)
+                         .Case("u8imm", TYPE_UIMM8)
+                         .Case("i16u8imm", TYPE_UIMM8)
+                         .Case("i32u8imm", TYPE_UIMM8)
+                         .Case("i64u8imm", TYPE_UIMM8)
+                         .Case("GR8", TYPE_R8)
+                         .Case("VR128", TYPE_XMM)
+                         .Case("VR128X", TYPE_XMM)
+                         .Case("f128mem", TYPE_M)
+                         .Case("f256mem", TYPE_M)
+                         .Case("f512mem", TYPE_M)
+                         .Case("FR128", TYPE_XMM)
+                         .Case("FR64", TYPE_XMM)
+                         .Case("FR64X", TYPE_XMM)
+                         .Case("f64mem", TYPE_M)
+                         .Case("sdmem", TYPE_M)
+                         .Case("FR16X", TYPE_XMM)
+                         .Case("FR32", TYPE_XMM)
+                         .Case("FR32X", TYPE_XMM)
+                         .Case("f32mem", TYPE_M)
+                         .Case("f16mem", TYPE_M)
+                         .Case("ssmem", TYPE_M)
+                         .Case("shmem", TYPE_M)
+                         .Case("RST", TYPE_ST)
+                         .Case("RSTi", TYPE_ST)
+                         .Case("i128mem", TYPE_M)
+                         .Case("i256mem", TYPE_M)
+                         .Case("i512mem", TYPE_M)
+                         .Case("i512mem_GR16", TYPE_M)
+                         .Case("i512mem_GR32", TYPE_M)
+                         .Case("i512mem_GR64", TYPE_M)
+                         .Case("i64i32imm_brtarget", TYPE_REL)
+                         .Case("i8imm_brtarget", TYPE_REL)
+                         .Case("i16imm_brtarget", TYPE_REL)
+                         .Case("i32imm_brtarget", TYPE_REL)
+                         .Case("ccode", TYPE_IMM)
+                         .Case("cflags", TYPE_IMM)
+                         .Case("AVX512RC", TYPE_IMM)
+                         .Case("brtarget32", TYPE_REL)
+                         .Case("brtarget16", TYPE_REL)
+                         .Case("brtarget8", TYPE_REL)
+                         .Case("f80mem", TYPE_M)
+                         .Case("lea64_8mem", TYPE_M)
+                         .Case("lea64_16mem", TYPE_M)
+                         .Case("lea64_32mem", TYPE_M)
+                         .Case("lea64mem", TYPE_M)
+                         .Case("VR64", TYPE_MM64)
+                         .Case("i64imm", TYPE_IMM)
+                         .Case("anymem", TYPE_M)
+                         .Case("opaquemem", TYPE_M)
+                         .Case("sibmem", TYPE_MSIB)
+                         .Case("SEGMENT_REG", TYPE_SEGMENTREG)
+                         .Case("DEBUG_REG", TYPE_DEBUGREG)
+                         .Case("CONTROL_REG", TYPE_CONTROLREG)
+                         .Case("srcidx8", TYPE_SRCIDX)
+                         .Case("srcidx16", TYPE_SRCIDX)
+                         .Case("srcidx32", TYPE_SRCIDX)
+                         .Case("srcidx64", TYPE_SRCIDX)
+                         .Case("dstidx8", TYPE_DSTIDX)
+                         .Case("dstidx16", TYPE_DSTIDX)
+                         .Case("dstidx32", TYPE_DSTIDX)
+                         .Case("dstidx64", TYPE_DSTIDX)
+                         .Case("offset16_8", TYPE_MOFFS)
+                         .Case("offset16_16", TYPE_MOFFS)
+                         .Case("offset16_32", TYPE_MOFFS)
+                         .Case("offset32_8", TYPE_MOFFS)
+                         .Case("offset32_16", TYPE_MOFFS)
+                         .Case("offset32_32", TYPE_MOFFS)
+                         .Case("offset32_64", TYPE_MOFFS)
+                         .Case("offset64_8", TYPE_MOFFS)
+                         .Case("offset64_16", TYPE_MOFFS)
+                         .Case("offset64_32", TYPE_MOFFS)
+                         .Case("offset64_64", TYPE_MOFFS)
+                         .Case("VR256", TYPE_YMM)
+                         .Case("VR256X", TYPE_YMM)
+                         .Case("VR512", TYPE_ZMM)
+                         .Case("VK1", TYPE_VK)
+                         .Case("VK1WM", TYPE_VK)
+                         .Case("VK2", TYPE_VK)
+                         .Case("VK2WM", TYPE_VK)
+                         .Case("VK4", TYPE_VK)
+                         .Case("VK4WM", TYPE_VK)
+                         .Case("VK8", TYPE_VK)
+                         .Case("VK8WM", TYPE_VK)
+                         .Case("VK16", TYPE_VK)
+                         .Case("VK16WM", TYPE_VK)
+                         .Case("VK32", TYPE_VK)
+                         .Case("VK32WM", TYPE_VK)
+                         .Case("VK64", TYPE_VK)
+                         .Case("VK64WM", TYPE_VK)
+                         .Case("VK1Pair", TYPE_VK_PAIR)
+                         .Case("VK2Pair", TYPE_VK_PAIR)
+                         .Case("VK4Pair", TYPE_VK_PAIR)
+                         .Case("VK8Pair", TYPE_VK_PAIR)
+                         .Case("VK16Pair", TYPE_VK_PAIR)
+                         .Case("vx32mem", TYPE_MVSIBX)
+                         .Case("vx64mem", TYPE_MVSIBX)
+                         .Case("vy32mem", TYPE_MVSIBY)
+                         .Case("vy64mem", TYPE_MVSIBY)
+                         .Case("vx32xmem", TYPE_MVSIBX)
+                         .Case("vx64xmem", TYPE_MVSIBX)
+                         .Case("vy32xmem", TYPE_MVSIBY)
+                         .Case("vy64xmem", TYPE_MVSIBY)
+                         .Case("vz32mem", TYPE_MVSIBZ)
+                         .Case("vz64mem", TYPE_MVSIBZ)
+                         .Case("BNDR", TYPE_BNDR)
+                         .Case("TILE", TYPE_TMM)
+                         .Case("TILEPair", TYPE_TMM_PAIR)
+                         .Default(TYPE_NONE);
+
+  if (Type != TYPE_NONE)
+    return Type;
   errs() << "Unhandled type string " << Str << "\n";
   llvm_unreachable("Unhandled type string");
 }
-#undef TYPE
-
-#define ENCODING(Expected, Encoding)                                           \
-  if (Str == Expected)                                                         \
-    return Encoding;
 
 OperandEncoding RecognizableInstr::immediateEncodingFromString(StringRef Str,
                                                                uint8_t OpSize) {
+  StringSwitch<OperandEncoding> Switch(Str);
   if (OpSize != X86Local::OpSize16) {
     // For instructions without an OpSize prefix, a declared 16-bit register or
     // immediate encoding is special.
-    ENCODING("i16imm", ENCODING_IW)
+    Switch.Case("i16imm", ENCODING_IW);
   }
-  ENCODING("i32i8imm", ENCODING_IB)
-  ENCODING("AVX512RC", ENCODING_IRC)
-  ENCODING("i16imm", ENCODING_Iv)
-  ENCODING("i16i8imm", ENCODING_IB)
-  ENCODING("i32imm", ENCODING_Iv)
-  ENCODING("i64i32imm", ENCODING_ID)
-  ENCODING("i64i8imm", ENCODING_IB)
-  ENCODING("i8imm", ENCODING_IB)
-  ENCODING("ccode", ENCODING_CC)
-  ENCODING("cflags", ENCODING_CF)
-  ENCODING("u4imm", ENCODING_IB)
-  ENCODING("u8imm", ENCODING_IB)
-  ENCODING("i16u8imm", ENCODING_IB)
-  ENCODING("i32u8imm", ENCODING_IB)
-  ENCODING("i64u8imm", ENCODING_IB)
-  // This is not a typo.  Instructions like BLENDVPD put
-  // register IDs in 8-bit immediates nowadays.
-  ENCODING("FR32", ENCODING_IB)
-  ENCODING("FR64", ENCODING_IB)
-  ENCODING("FR128", ENCODING_IB)
-  ENCODING("VR128", ENCODING_IB)
-  ENCODING("VR256", ENCODING_IB)
-  ENCODING("FR16X", ENCODING_IB)
-  ENCODING("FR32X", ENCODING_IB)
-  ENCODING("FR64X", ENCODING_IB)
-  ENCODING("VR128X", ENCODING_IB)
-  ENCODING("VR256X", ENCODING_IB)
-  ENCODING("VR512", ENCODING_IB)
-  ENCODING("TILE", ENCODING_IB)
+  OperandEncoding Encoding =
+      Switch.Case("i32i8imm", ENCODING_IB)
+          .Case("AVX512RC", ENCODING_IRC)
+          .Case("i16imm", ENCODING_Iv)
+          .Case("i16i8imm", ENCODING_IB)
+          .Case("i32imm", ENCODING_Iv)
+          .Case("i64i32imm", ENCODING_ID)
+          .Case("i64i8imm", ENCODING_IB)
+          .Case("i8imm", ENCODING_IB)
+          .Case("ccode", ENCODING_CC)
+          .Case("cflags", ENCODING_CF)
+          .Case("u4imm", ENCODING_IB)
+          .Case("u8imm", ENCODING_IB)
+          .Case("i16u8imm", ENCODING_IB)
+          .Case("i32u8imm", ENCODING_IB)
+          .Case("i64u8imm", ENCODING_IB)
+          // This is not a typo.  Instructions like BLENDVPD put
+          // register IDs in 8-bit immediates nowadays.
+          .Case("FR32", ENCODING_IB)
+          .Case("FR64", ENCODING_IB)
+          .Case("FR128", ENCODING_IB)
+          .Case("VR128", ENCODING_IB)
+          .Case("VR256", ENCODING_IB)
+          .Case("FR16X", ENCODING_IB)
+          .Case("FR32X", ENCODING_IB)
+          .Case("FR64X", ENCODING_IB)
+          .Case("VR128X", ENCODING_IB)
+          .Case("VR256X", ENCODING_IB)
+          .Case("VR512", ENCODING_IB)
+          .Case("TILE", ENCODING_IB)
+          .Default(ENCODING_NONE);
+
+  if (Encoding != ENCODING_NONE)
+    return Encoding;
   errs() << "Unhandled immediate encoding " << Str << "\n";
   llvm_unreachable("Unhandled immediate encoding");
 }
 
 OperandEncoding
 RecognizableInstr::rmRegisterEncodingFromString(StringRef Str, uint8_t OpSize) {
-  ENCODING("RST", ENCODING_FP)
-  ENCODING("RSTi", ENCODING_FP)
-  ENCODING("GR16", ENCODING_RM)
-  ENCODING("GR16orGR32orGR64", ENCODING_RM)
-  ENCODING("GR32", ENCODING_RM)
-  ENCODING("GR32orGR64", ENCODING_RM)
-  ENCODING("GR64", ENCODING_RM)
-  ENCODING("GR8", ENCODING_RM)
-  ENCODING("VR128", ENCODING_RM)
-  ENCODING("VR128X", ENCODING_RM)
-  ENCODING("FR128", ENCODING_RM)
-  ENCODING("FR64", ENCODING_RM)
-  ENCODING("FR32", ENCODING_RM)
-  ENCODING("FR64X", ENCODING_RM)
-  ENCODING("FR32X", ENCODING_RM)
-  ENCODING("FR16X", ENCODING_RM)
-  ENCODING("VR64", ENCODING_RM)
-  ENCODING("VR256", ENCODING_RM)
-  ENCODING("VR256X", ENCODING_RM)
-  ENCODING("VR512", ENCODING_RM)
-  ENCODING("VK1", ENCODING_RM)
-  ENCODING("VK2", ENCODING_RM)
-  ENCODING("VK4", ENCODING_RM)
-  ENCODING("VK8", ENCODING_RM)
-  ENCODING("VK16", ENCODING_RM)
-  ENCODING("VK32", ENCODING_RM)
-  ENCODING("VK64", ENCODING_RM)
-  ENCODING("BNDR", ENCODING_RM)
-  ENCODING("TILE", ENCODING_RM)
-  ENCODING("TILEPair", ENCODING_RM)
+  auto Encoding = StringSwitch<OperandEncoding>(Str)
+                      .Case("RST", ENCODING_FP)
+                      .Case("RSTi", ENCODING_FP)
+                      .Case("GR16", ENCODING_RM)
+                      .Case("GR16orGR32orGR64", ENCODING_RM)
+                      .Case("GR32", ENCODING_RM)
+                      .Case("GR32orGR64", ENCODING_RM)
+                      .Case("GR64", ENCODING_RM)
+                      .Case("GR8", ENCODING_RM)
+                      .Case("VR128", ENCODING_RM)
+                      .Case("VR128X", ENCODING_RM)
+                      .Case("FR128", ENCODING_RM)
+                      .Case("FR64", ENCODING_RM)
+                      .Case("FR32", ENCODING_RM)
+                      .Case("FR64X", ENCODING_RM)
+                      .Case("FR32X", ENCODING_RM)
+                      .Case("FR16X", ENCODING_RM)
+                      .Case("VR64", ENCODING_RM)
+                      .Case("VR256", ENCODING_RM)
+                      .Case("VR256X", ENCODING_RM)
+                      .Case("VR512", ENCODING_RM)
+                      .Case("VK1", ENCODING_RM)
+                      .Case("VK2", ENCODING_RM)
+                      .Case("VK4", ENCODING_RM)
+                      .Case("VK8", ENCODING_RM)
+                      .Case("VK16", ENCODING_RM)
+                      .Case("VK32", ENCODING_RM)
+                      .Case("VK64", ENCODING_RM)
+                      .Case("BNDR", ENCODING_RM)
+                      .Case("TILE", ENCODING_RM)
+                      .Case("TILEPair", ENCODING_RM)
+                      .Default(ENCODING_NONE);
+  if (Encoding != ENCODING_NONE)
+    return Encoding;
   errs() << "Unhandled R/M register encoding " << Str << "\n";
   llvm_unreachable("Unhandled R/M register encoding");
 }
 
 OperandEncoding
 RecognizableInstr::roRegisterEncodingFromString(StringRef Str, uint8_t OpSize) {
-  ENCODING("GR16", ENCODING_REG)
-  ENCODING("GR16orGR32orGR64", ENCODING_REG)
-  ENCODING("GR32", ENCODING_REG)
-  ENCODING("GR32orGR64", ENCODING_REG)
-  ENCODING("GR64", ENCODING_REG)
-  ENCODING("GR8", ENCODING_REG)
-  ENCODING("VR128", ENCODING_REG)
-  ENCODING("FR128", ENCODING_REG)
-  ENCODING("FR64", ENCODING_REG)
-  ENCODING("FR32", ENCODING_REG)
-  ENCODING("VR64", ENCODING_REG)
-  ENCODING("SEGMENT_REG", ENCODING_REG)
-  ENCODING("DEBUG_REG", ENCODING_REG)
-  ENCODING("CONTROL_REG", ENCODING_REG)
-  ENCODING("VR256", ENCODING_REG)
-  ENCODING("VR256X", ENCODING_REG)
-  ENCODING("VR128X", ENCODING_REG)
-  ENCODING("FR64X", ENCODING_REG)
-  ENCODING("FR32X", ENCODING_REG)
-  ENCODING("FR16X", ENCODING_REG)
-  ENCODING("VR512", ENCODING_REG)
-  ENCODING("VK1", ENCODING_REG)
-  ENCODING("VK2", ENCODING_REG)
-  ENCODING("VK4", ENCODING_REG)
-  ENCODING("VK8", ENCODING_REG)
-  ENCODING("VK16", ENCODING_REG)
-  ENCODING("VK32", ENCODING_REG)
-  ENCODING("VK64", ENCODING_REG)
-  ENCODING("VK1Pair", ENCODING_REG)
-  ENCODING("VK2Pair", ENCODING_REG)
-  ENCODING("VK4Pair", ENCODING_REG)
-  ENCODING("VK8Pair", ENCODING_REG)
-  ENCODING("VK16Pair", ENCODING_REG)
-  ENCODING("VK1WM", ENCODING_REG)
-  ENCODING("VK2WM", ENCODING_REG)
-  ENCODING("VK4WM", ENCODING_REG)
-  ENCODING("VK8WM", ENCODING_REG)
-  ENCODING("VK16WM", ENCODING_REG)
-  ENCODING("VK32WM", ENCODING_REG)
-  ENCODING("VK64WM", ENCODING_REG)
-  ENCODING("BNDR", ENCODING_REG)
-  ENCODING("TILE", ENCODING_REG)
-  ENCODING("TILEPair", ENCODING_REG)
+  auto Encoding = StringSwitch<OperandEncoding>(Str)
+                      .Case("GR16", ENCODING_REG)
+                      .Case("GR16orGR32orGR64", ENCODING_REG)
+                      .Case("GR32", ENCODING_REG)
+                      .Case("GR32orGR64", ENCODING_REG)
+                      .Case("GR64", ENCODING_REG)
+                      .Case("GR8", ENCODING_REG)
+                      .Case("VR128", ENCODING_REG)
+                      .Case("FR128", ENCODING_REG)
+                      .Case("FR64", ENCODING_REG)
+                      .Case("FR32", ENCODING_REG)
+            ...
[truncated]

Copy link
Contributor

@wangpc-pp wangpc-pp left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! LGTM!

@jurahul jurahul merged commit 2110faa into llvm:main May 15, 2025
11 checks passed
@jurahul jurahul deleted the tablegen_use_stringswitch_x86 branch May 15, 2025 12:31
@llvm-ci
Copy link
Collaborator

llvm-ci commented May 15, 2025

LLVM Buildbot has detected a new failure on builder clang-cmake-x86_64-avx512-linux running on avx512-intel64 while building llvm at step 13 "setup lit".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/133/builds/16189

Here is the relevant piece of the build log for the reference
Step 13 (setup lit) failure: '/localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/bin/python /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/lnt/setup.py ...' (failure)
...
writing top-level names to LNT.egg-info/top_level.txt
reading manifest file 'LNT.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
no previously-included directories found matching 'docs/_build'
no previously-included directories found matching 'tests/*/Output'
no previously-included directories found matching 'tests/*/*/Output'
adding license file 'LICENSE.TXT'
writing manifest file 'LNT.egg-info/SOURCES.txt'
running build_ext
copying build/lib.linux-x86_64-cpython-39/lnt/testing/profile/cPerf.cpython-39-x86_64-linux-gnu.so -> lnt/testing/profile
Creating /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages/LNT.egg-link (link to .)
Adding LNT 0.4.2.dev0 to easy-install.pth file
Installing lnt script to /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/bin

Installed /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/lnt
Processing dependencies for LNT==0.4.2.dev0
Searching for certifi
Reading https://pypi.org/simple/certifi/
Downloading https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl#sha256=30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3
Best match: certifi 2025.4.26
Processing certifi-2025.4.26-py3-none-any.whl
Installing certifi-2025.4.26-py3-none-any.whl to /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages
Adding certifi 2025.4.26 to easy-install.pth file

Installed /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages/certifi-2025.4.26-py3.9.egg
Searching for lit==0.11.1
Reading https://pypi.org/simple/lit/
Downloading https://files.pythonhosted.org/packages/c8/20/a1c3f83acd15874d953b26f87d94d92bde23d614a711c9e75f60744df2f3/lit-0.11.1-py3-none-any.whl#sha256=4fa0cafcedf9e278d4ffa69bfa1a0482db41fdb1d055c8b9fc29501511abeb16
Best match: lit 0.11.1
Processing lit-0.11.1-py3-none-any.whl
Installing lit-0.11.1-py3-none-any.whl to /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages
Adding lit 0.11.1 to easy-install.pth file
detected new path './certifi-2025.4.26-py3.9.egg'
Installing lit script to /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/bin

Installed /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages/lit-0.11.1-py3.9.egg
Searching for requests
Reading https://pypi.org/simple/requests/
Downloading https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl#sha256=70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6
Best match: requests 2.32.3
Processing requests-2.32.3-py3-none-any.whl
Installing requests-2.32.3-py3-none-any.whl to /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages
Adding requests 2.32.3 to easy-install.pth file
detected new path './lit-0.11.1-py3.9.egg'

Installed /localdisk2/buildbot/llvm-worker/clang-cmake-x86_64-avx512-linux/test/sandbox/lib64/python3.9/site-packages/requests-2.32.3-py3.9.egg
Searching for pyyaml==5.1.2
Reading https://pypi.org/simple/pyyaml/
Downloading https://files.pythonhosted.org/packages/e3/e8/b3212641ee2718d556df0f23f78de8303f068fe29cdaa7a91018849582fe/PyYAML-5.1.2.tar.gz#sha256=01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4
error: The read operation timed out

TIFitis pushed a commit to TIFitis/llvm-project that referenced this pull request May 19, 2025
…m#139929)

Use StringSwitch instead of macro to map from a string to enum values in
X86RecognizableInstr.cpp.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants