[llvm] [SystemZ] Expand and automate .insn directive coverage (PR #222031)

Dominik Steenken via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 9 04:45:53 PDT 2026


https://github.com/dominik-steenken updated https://github.com/llvm/llvm-project/pull/222031

>From 3ed8eff7ce0b33816124d551fafd1a5eeead9c49 Mon Sep 17 00:00:00 2001
From: Dominik Steenken <dost at de.ibm.com>
Date: Thu, 26 Jun 2025 14:44:30 +0200
Subject: [PATCH 1/4] [SystemZ] Support all formats with .insn directive

This commit expands the set of supported instruction formats for the .insn
directive to all published instruction formats. This includes all of the
subformats (e.g., RI-a, RI-b, etc.). Subformats are indicated by an
underscore `_`, followed by the subscript letter of the subformat in the
assembly (e.g. "ri_a" for RI-a). Newly supported formats are:

- I
- IE
- MII
- RI-[abc]
- RIE-[abcdefg]
- RIL[abc]
- RRD
- RRF-[abcde]
- RS-[ab]
- RSL-[ab]
- RSY-[ab]
- RX-[ab]
- RXY-[abc]
- SMI
- SS-[abcdef]
- VRI-[abcdefghijkl]
- VRR-[abcdefghijk]
- VRS-[abcd]

Note that some of these formats have immediate operands which are interpreted
inconsistently by the instructions using the format, i.e. some instructions
use them as signed immediates, while some use them as unsigned immediates.
This commit adds assembler operand types to support a range check on these
immediates that uses the union of the signed and unsigned ranges. So, an
8-bit immediate in a format that is used in both signed and unsigned forms
will accept the range [-128..255].

This commit also reorganizes the tests for the .insn directives to group
them by machine, to mirror the regular assembly tests.
---
 .../SystemZ/AsmParser/SystemZAsmParser.cpp    | 404 ++++++++++++---
 .../MCTargetDesc/SystemZInstPrinterCommon.cpp |  27 +
 .../MCTargetDesc/SystemZInstPrinterCommon.h   |   3 +
 .../MCTargetDesc/SystemZMCAsmBackend.cpp      |  12 +
 .../SystemZ/MCTargetDesc/SystemZMCFixups.h    |   7 +
 .../lib/Target/SystemZ/SystemZInstrFormats.td | 471 +++++++++++++++++-
 llvm/lib/Target/SystemZ/SystemZInstrInfo.td   | 413 ++++++++++++---
 llvm/lib/Target/SystemZ/SystemZOperands.td    |  18 +
 llvm/test/MC/SystemZ/directive-insn-z13.s     |  59 +++
 llvm/test/MC/SystemZ/directive-insn-z14.s     |  33 ++
 llvm/test/MC/SystemZ/directive-insn-z16.s     |  14 +
 llvm/test/MC/SystemZ/directive-insn-z17.s     |  23 +
 llvm/test/MC/SystemZ/directive-insn.s         | 136 ++++-
 13 files changed, 1470 insertions(+), 150 deletions(-)
 create mode 100644 llvm/test/MC/SystemZ/directive-insn-z13.s
 create mode 100644 llvm/test/MC/SystemZ/directive-insn-z14.s
 create mode 100644 llvm/test/MC/SystemZ/directive-insn-z16.s
 create mode 100644 llvm/test/MC/SystemZ/directive-insn-z17.s

diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
index 761cbaaedd22d..9484030c87aa1 100644
--- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
+++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
@@ -397,11 +397,14 @@ class SystemZOperand : public MCParsedAsmOperand {
   bool isU4Imm() const { return isImm(0, 15); }
   bool isU8Imm() const { return isImm(0, 255); }
   bool isS8Imm() const { return isImm(-128, 127); }
+  bool isX8Imm() const { return isS8Imm() || isU8Imm(); }
   bool isU12Imm() const { return isImm(0, 4095); }
   bool isU16Imm() const { return isImm(0, 65535); }
   bool isS16Imm() const { return isImm(-32768, 32767); }
+  bool isX16Imm() const { return isS16Imm() || isU16Imm(); }
   bool isU32Imm() const { return isImm(0, (1LL << 32) - 1); }
   bool isS32Imm() const { return isImm(-(1LL << 31), (1LL << 31) - 1); }
+  bool isX32Imm() const { return isS32Imm() || isU32Imm(); }
   bool isU48Imm() const { return isImm(0, (1LL << 48) - 1); }
 };
 
@@ -663,71 +666,333 @@ struct CompareInsn {
 
 // Table initializing information for parsing the .insn directive.
 static struct InsnMatchEntry InsnMatchTable[] = {
-  /* Format, Opcode, NumOperands, OperandKinds */
-  { "e", SystemZ::InsnE, 1,
-    { MCK_U16Imm } },
-  { "ri", SystemZ::InsnRI, 3,
-    { MCK_U32Imm, MCK_AnyReg, MCK_S16Imm } },
-  { "rie", SystemZ::InsnRIE, 4,
-    { MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_PCRel16 } },
-  { "ril", SystemZ::InsnRIL, 3,
-    { MCK_U48Imm, MCK_AnyReg, MCK_PCRel32 } },
-  { "rilu", SystemZ::InsnRILU, 3,
-    { MCK_U48Imm, MCK_AnyReg, MCK_U32Imm } },
-  { "ris", SystemZ::InsnRIS, 5,
-    { MCK_U48Imm, MCK_AnyReg, MCK_S8Imm, MCK_U4Imm, MCK_BDAddr64Disp12 } },
-  { "rr", SystemZ::InsnRR, 3,
-    { MCK_U16Imm, MCK_AnyReg, MCK_AnyReg } },
-  { "rre", SystemZ::InsnRRE, 3,
-    { MCK_U32Imm, MCK_AnyReg, MCK_AnyReg } },
-  { "rrf", SystemZ::InsnRRF, 5,
-    { MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm } },
-  { "rrs", SystemZ::InsnRRS, 5,
-    { MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_BDAddr64Disp12 } },
-  { "rs", SystemZ::InsnRS, 4,
-    { MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12 } },
-  { "rse", SystemZ::InsnRSE, 4,
-    { MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12 } },
-  { "rsi", SystemZ::InsnRSI, 4,
-    { MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_PCRel16 } },
-  { "rsy", SystemZ::InsnRSY, 4,
-    { MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp20 } },
-  { "rx", SystemZ::InsnRX, 3,
-    { MCK_U32Imm, MCK_AnyReg, MCK_BDXAddr64Disp12 } },
-  { "rxe", SystemZ::InsnRXE, 3,
-    { MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp12 } },
-  { "rxf", SystemZ::InsnRXF, 4,
-    { MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDXAddr64Disp12 } },
-  { "rxy", SystemZ::InsnRXY, 3,
-    { MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20 } },
-  { "s", SystemZ::InsnS, 2,
-    { MCK_U32Imm, MCK_BDAddr64Disp12 } },
-  { "si", SystemZ::InsnSI, 3,
-    { MCK_U32Imm, MCK_BDAddr64Disp12, MCK_S8Imm } },
-  { "sil", SystemZ::InsnSIL, 3,
-    { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_U16Imm } },
-  { "siy", SystemZ::InsnSIY, 3,
-    { MCK_U48Imm, MCK_BDAddr64Disp20, MCK_U8Imm } },
-  { "ss", SystemZ::InsnSS, 4,
-    { MCK_U48Imm, MCK_BDXAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } },
-  { "sse", SystemZ::InsnSSE, 3,
-    { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12 } },
-  { "ssf", SystemZ::InsnSSF, 4,
-    { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } },
-  { "vri", SystemZ::InsnVRI, 6,
-    { MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm } },
-  { "vrr", SystemZ::InsnVRR, 7,
-    { MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm,
-      MCK_U4Imm } },
-  { "vrs", SystemZ::InsnVRS, 5,
-    { MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_BDAddr64Disp12, MCK_U4Imm } },
-  { "vrv", SystemZ::InsnVRV, 4,
-    { MCK_U48Imm, MCK_VR128, MCK_BDVAddr64Disp12, MCK_U4Imm } },
-  { "vrx", SystemZ::InsnVRX, 4,
-    { MCK_U48Imm, MCK_VR128, MCK_BDXAddr64Disp12, MCK_U4Imm } },
-  { "vsi", SystemZ::InsnVSI, 4,
-    { MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_U8Imm } }
-};
+    /* Format, Opcode, NumOperands, OperandKinds */
+    {"e", SystemZ::InsnE, 1, {MCK_U16Imm}},
+    {"i", SystemZ::InsnI, 2, {MCK_U16Imm, MCK_U8Imm}},
+    {"ie", SystemZ::InsnIE, 3, {MCK_U32Imm, MCK_U4Imm, MCK_U4Imm}},
+    {"mii",
+     SystemZ::InsnMII,
+     4,
+     {MCK_U48Imm, MCK_U4Imm, MCK_PCRel12, MCK_PCRel24}},
+    {"ri", SystemZ::InsnRIa, 3, {MCK_U32Imm, MCK_AnyReg, MCK_S16Imm}},
+    {"ri_a", SystemZ::InsnRIa, 3, {MCK_U32Imm, MCK_AnyReg, MCK_X16Imm}},
+    {"ri_b", SystemZ::InsnRIb, 3, {MCK_U32Imm, MCK_AnyReg, MCK_PCRel16}},
+    {"ri_c", SystemZ::InsnRIc, 3, {MCK_U32Imm, MCK_U4Imm, MCK_PCRel16}},
+    {"rie",
+     SystemZ::InsnRIE,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_PCRel16}},
+    {"rie_a",
+     SystemZ::InsnRIEa,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_X16Imm, MCK_U4Imm}},
+    {"rie_b",
+     SystemZ::InsnRIEb,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_PCRel16}},
+    {"rie_c",
+     SystemZ::InsnRIEc,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_X8Imm, MCK_U4Imm, MCK_PCRel16}},
+    {"rie_d",
+     SystemZ::InsnRIEd,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_S16Imm, MCK_AnyReg}},
+    {"rie_e",
+     SystemZ::InsnRIEe,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_PCRel16, MCK_AnyReg}},
+    {"rie_f",
+     SystemZ::InsnRIEf,
+     6,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U8Imm, MCK_U8Imm, MCK_U8Imm}},
+    {"rie_g",
+     SystemZ::InsnRIEg,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_S16Imm, MCK_U4Imm}},
+    {"ril", SystemZ::InsnRIL, 3, {MCK_U48Imm, MCK_AnyReg, MCK_PCRel32}},
+    {"ril_a", SystemZ::InsnRILa, 3, {MCK_U48Imm, MCK_AnyReg, MCK_X32Imm}},
+    {"ril_b", SystemZ::InsnRILb, 3, {MCK_U48Imm, MCK_AnyReg, MCK_PCRel32}},
+    {"ril_c", SystemZ::InsnRILc, 3, {MCK_U48Imm, MCK_U4Imm, MCK_PCRel32}},
+    {"rilu", SystemZ::InsnRILU, 3, {MCK_U48Imm, MCK_AnyReg, MCK_U32Imm}},
+    {"ris",
+     SystemZ::InsnRIS,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_X8Imm, MCK_U4Imm, MCK_BDAddr64Disp12}},
+    {"rr", SystemZ::InsnRR, 3, {MCK_U16Imm, MCK_AnyReg, MCK_AnyReg}},
+    {"rrd",
+     SystemZ::InsnRRD,
+     4,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg}},
+    {"rre", SystemZ::InsnRRE, 3, {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg}},
+
+    {"rrf",
+     SystemZ::InsnRRF,
+     5,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
+    {"rrf_a",
+     SystemZ::InsnRRFa,
+     5,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
+    {"rrf_b",
+     SystemZ::InsnRRFb,
+     5,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
+    {"rrf_c",
+     SystemZ::InsnRRFc,
+     4,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
+    {"rrf_d",
+     SystemZ::InsnRRFd,
+     4,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
+    {"rrf_e",
+     SystemZ::InsnRRFe,
+     5,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_U4Imm}},
+    {"rrs",
+     SystemZ::InsnRRS,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_BDAddr64Disp12}},
+    {"rs",
+     SystemZ::InsnRS,
+     4,
+     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12}},
+    {"rs_a",
+     SystemZ::InsnRSa,
+     4,
+     {MCK_U32Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_AnyReg}},
+    {"rs_b",
+     SystemZ::InsnRSb,
+     4,
+     {MCK_U32Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_U4Imm}},
+    {"rse",
+     SystemZ::InsnRSE,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12}},
+    {"rsi",
+     SystemZ::InsnRSI,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_PCRel16}},
+    {"rsl_a", SystemZ::InsnRSLa, 2, {MCK_U48Imm, MCK_BDLAddr64Disp12Len4}},
+    {"rsl_b",
+     SystemZ::InsnRSLb,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDLAddr64Disp12Len8, MCK_U4Imm}},
+    {"rsy",
+     SystemZ::InsnRSY,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp20}},
+    {"rsy_a",
+     SystemZ::InsnRSYa,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp20, MCK_AnyReg}},
+    {"rsy_b",
+     SystemZ::InsnRSYb,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp20, MCK_U4Imm}},
+    {"rx", SystemZ::InsnRX, 3, {MCK_U32Imm, MCK_AnyReg, MCK_BDXAddr64Disp12}},
+    {"rx_a",
+     SystemZ::InsnRXa,
+     3,
+     {MCK_U32Imm, MCK_AnyReg, MCK_BDXAddr64Disp12}},
+    {"rx_b", SystemZ::InsnRXb, 3, {MCK_U32Imm, MCK_U4Imm, MCK_BDXAddr64Disp12}},
+    {"rxe", SystemZ::InsnRXE, 3, {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp12}},
+    {"rxf",
+     SystemZ::InsnRXF,
+     4,
+     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDXAddr64Disp12}},
+    {"rxy", SystemZ::InsnRXY, 3, {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20}},
+    {"rxy_a",
+     SystemZ::InsnRXYa,
+     3,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20}},
+    {"rxy_b",
+     SystemZ::InsnRXYb,
+     3,
+     {MCK_U48Imm, MCK_U4Imm, MCK_BDXAddr64Disp20}},
+    {"rxy_c",
+     SystemZ::InsnRXYc,
+     3,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20}},
+    {"s", SystemZ::InsnS, 2, {MCK_U32Imm, MCK_BDAddr64Disp12}},
+    {"si", SystemZ::InsnSI, 3, {MCK_U32Imm, MCK_BDAddr64Disp12, MCK_X8Imm}},
+    {"sil", SystemZ::InsnSIL, 3, {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_X16Imm}},
+    {"siy", SystemZ::InsnSIY, 3, {MCK_U48Imm, MCK_BDAddr64Disp20, MCK_X8Imm}},
+    {"smi",
+     SystemZ::InsnSMI,
+     4,
+     {MCK_U48Imm, MCK_U4Imm, MCK_PCRel16, MCK_BDAddr64Disp12}},
+    {"ss",
+     SystemZ::InsnSS,
+     4,
+     {MCK_U48Imm, MCK_BDXAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg}},
+    {"ss_a",
+     SystemZ::InsnSSa,
+     3,
+     {MCK_U48Imm, MCK_BDLAddr64Disp12Len8, MCK_BDAddr64Disp12}},
+    {"ss_b",
+     SystemZ::InsnSSb,
+     3,
+     {MCK_U48Imm, MCK_BDLAddr64Disp12Len4, MCK_BDLAddr64Disp12Len4}},
+    {"ss_c",
+     SystemZ::InsnSSc,
+     4,
+     {MCK_U48Imm, MCK_BDLAddr64Disp12Len4, MCK_BDAddr64Disp12, MCK_U4Imm}},
+    {"ss_d",
+     SystemZ::InsnSSd,
+     4,
+     {MCK_U48Imm, MCK_BDXAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg}},
+    {"ss_e",
+     SystemZ::InsnSSe,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_AnyReg,
+      MCK_BDAddr64Disp12}},
+    {"ss_f",
+     SystemZ::InsnSSf,
+     3,
+     {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDLAddr64Disp12Len8}},
+    {"sse",
+     SystemZ::InsnSSE,
+     3,
+     {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12}},
+    {"ssf",
+     SystemZ::InsnSSF,
+     4,
+     {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg}},
+    {"vri",
+     SystemZ::InsnVRIe,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm}},
+    {"vri_a",
+     SystemZ::InsnVRIa,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_X16Imm, MCK_U4Imm}},
+    {"vri_b",
+     SystemZ::InsnVRIb,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_U8Imm, MCK_U8Imm, MCK_U4Imm}},
+    {"vri_c",
+     SystemZ::InsnVRIc,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_U16Imm, MCK_VR128, MCK_U4Imm}},
+    {"vri_d",
+     SystemZ::InsnVRId,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U4Imm}},
+    {"vri_e",
+     SystemZ::InsnVRIe,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U16Imm, MCK_U4Imm, MCK_U4Imm}},
+    {"vri_f",
+     SystemZ::InsnVRIf,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U4Imm}},
+    {"vri_g",
+     SystemZ::InsnVRIg,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U8Imm, MCK_U4Imm}},
+    {"vri_h",
+     SystemZ::InsnVRIh,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_U16Imm, MCK_U4Imm, MCK_U4Imm}},
+    {"vri_i",
+     SystemZ::InsnVRIi,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_AnyReg, MCK_U8Imm, MCK_U4Imm}},
+    {"vri_j",
+     SystemZ::InsnVRIj,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U4Imm}},
+    {"vri_k",
+     SystemZ::InsnVRIk,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U8Imm}},
+    {"vri_l",
+     SystemZ::InsnVRIl,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U16Imm}},
+    {"vrr",
+     SystemZ::InsnVRR,
+     7,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm,
+      MCK_U4Imm}},
+    {"vrr_a",
+     SystemZ::InsnVRRa,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm, MCK_U4Imm}},
+    {"vrr_b",
+     SystemZ::InsnVRRb,
+     6,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm}},
+    {"vrr_c",
+     SystemZ::InsnVRRc,
+     7,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm,
+      MCK_U4Imm}},
+    {"vrr_d",
+     SystemZ::InsnVRRd,
+     7,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm,
+      MCK_U4Imm}},
+    {"vrr_e",
+     SystemZ::InsnVRRe,
+     7,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm,
+      MCK_U4Imm}},
+    {"vrr_f",
+     SystemZ::InsnVRRf,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_AnyReg, MCK_AnyReg}},
+    {"vrr_g", SystemZ::InsnVRRg, 3, {MCK_U48Imm, MCK_VR128, MCK_U16Imm}},
+    {"vrr_h",
+     SystemZ::InsnVRRh,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U4Imm}},
+    {"vrr_i",
+     SystemZ::InsnVRRi,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_U4Imm, MCK_U4Imm}},
+    {"vrr_j",
+     SystemZ::InsnVRRj,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm}},
+    {"vrr_k",
+     SystemZ::InsnVRRk,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U4Imm}},
+    {"vrs",
+     SystemZ::InsnVRS,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_BDAddr64Disp12, MCK_U4Imm}},
+    {"vrs_a",
+     SystemZ::InsnVRSa,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_VR128, MCK_U4Imm}},
+    {"vrs_b",
+     SystemZ::InsnVRSb,
+     5,
+     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_AnyReg, MCK_U4Imm}},
+    {"vrs_c",
+     SystemZ::InsnVRSc,
+     5,
+     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_VR128, MCK_U4Imm}},
+    {"vrs_d",
+     SystemZ::InsnVRSd,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_AnyReg}},
+    {"vrv",
+     SystemZ::InsnVRV,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_BDVAddr64Disp12, MCK_U4Imm}},
+    {"vrx",
+     SystemZ::InsnVRX,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_BDXAddr64Disp12, MCK_U4Imm}},
+    {"vsi",
+     SystemZ::InsnVSI,
+     4,
+     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_U8Imm}}};
 
 void SystemZOperand::print(raw_ostream &OS, const MCAsmInfo &MAI) const {
   switch (Kind) {
@@ -1311,6 +1576,12 @@ bool SystemZAsmParser::parseDirectiveInsn(SMLoc L) {
       ResTy = parsePCRel32(Operands);
     else if (Kind == MCK_PCRel16)
       ResTy = parsePCRel16(Operands);
+    else if (Kind == MCK_PCRel12)
+      ResTy = parsePCRel12(Operands);
+    else if (Kind == MCK_PCRel24)
+      ResTy = parsePCRel24(Operands);
+    else if (Kind == MCK_BDLAddr64Disp12Len4 || Kind == MCK_BDLAddr64Disp12Len8)
+      ResTy = parseBDLAddr64(Operands);
     else {
       // Only remaining operand kind is an immediate.
       const MCExpr *Expr;
@@ -1319,7 +1590,6 @@ bool SystemZAsmParser::parseDirectiveInsn(SMLoc L) {
       // Expect immediate expression.
       if (Parser.parseExpression(Expr))
         return Error(StartLoc, "unexpected token in directive");
-
       SMLoc EndLoc =
         SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
 
@@ -1353,6 +1623,8 @@ bool SystemZAsmParser::parseDirectiveInsn(SMLoc L) {
       ZOperand.addBDXAddrOperands(Inst, 3);
     else if (ZOperand.isMem(BDVMem))
       ZOperand.addBDVAddrOperands(Inst, 3);
+    else if (ZOperand.isMem(BDLMem))
+      ZOperand.addBDLAddrOperands(Inst, 3);
     else if (ZOperand.isMem(LXAMem))
       ZOperand.addLXAAddrOperands(Inst, 3);
     else if (ZOperand.isImm())
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.cpp
index a24543b699ab4..1e9936194c94a 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.cpp
@@ -118,6 +118,15 @@ void SystemZInstPrinterCommon::printU8ImmOperand(const MCInst *MI, int OpNum,
   printUImmOperand<8>(MI, OpNum, O);
 }
 
+void SystemZInstPrinterCommon::printX8ImmOperand(const MCInst *MI, int OpNum,
+                                                 raw_ostream &O) {
+  int64_t Value = MI->getOperand(OpNum).getImm();
+  if (Value >= 0)
+    printUImmOperand<8>(MI, OpNum, O);
+  else
+    printSImmOperand<8>(MI, OpNum, O);
+}
+
 void SystemZInstPrinterCommon::printU12ImmOperand(const MCInst *MI, int OpNum,
                                                   raw_ostream &O) {
   printUImmOperand<12>(MI, OpNum, O);
@@ -133,6 +142,15 @@ void SystemZInstPrinterCommon::printU16ImmOperand(const MCInst *MI, int OpNum,
   printUImmOperand<16>(MI, OpNum, O);
 }
 
+void SystemZInstPrinterCommon::printX16ImmOperand(const MCInst *MI, int OpNum,
+                                                  raw_ostream &O) {
+  int64_t Value = MI->getOperand(OpNum).getImm();
+  if (Value >= 0)
+    printUImmOperand<16>(MI, OpNum, O);
+  else
+    printSImmOperand<16>(MI, OpNum, O);
+}
+
 void SystemZInstPrinterCommon::printS32ImmOperand(const MCInst *MI, int OpNum,
                                                   raw_ostream &O) {
   printSImmOperand<32>(MI, OpNum, O);
@@ -143,6 +161,15 @@ void SystemZInstPrinterCommon::printU32ImmOperand(const MCInst *MI, int OpNum,
   printUImmOperand<32>(MI, OpNum, O);
 }
 
+void SystemZInstPrinterCommon::printX32ImmOperand(const MCInst *MI, int OpNum,
+                                                  raw_ostream &O) {
+  int64_t Value = MI->getOperand(OpNum).getImm();
+  if (Value >= 0)
+    printUImmOperand<32>(MI, OpNum, O);
+  else
+    printSImmOperand<32>(MI, OpNum, O);
+}
+
 void SystemZInstPrinterCommon::printU48ImmOperand(const MCInst *MI, int OpNum,
                                                   raw_ostream &O) {
   printUImmOperand<48>(MI, OpNum, O);
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.h b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.h
index 427dbba6ad1b4..3d6aa3c12eb52 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.h
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZInstPrinterCommon.h
@@ -65,11 +65,14 @@ class SystemZInstPrinterCommon : public MCInstPrinter {
   void printU4ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printS8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printU8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
+  void printX8ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printU12ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printS16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printU16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
+  void printX16ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printS32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printU32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
+  void printX32ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printU48ImmOperand(const MCInst *MI, int OpNum, raw_ostream &O);
   void printPCRelOperand(const MCInst *MI, uint64_t Address, int OpNum,
                          raw_ostream &O);
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmBackend.cpp b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmBackend.cpp
index d692cbed129ca..0cfe4db5cae65 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmBackend.cpp
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmBackend.cpp
@@ -54,6 +54,12 @@ static uint64_t extractBitsForFixup(MCFixupKind Kind, uint64_t Value,
     return Value;
   };
 
+  auto handleXImmValue = [&](unsigned W) -> uint64_t {
+    if (!checkFixupInRange(minIntN(W), maxUIntN(W)))
+      return 0;
+    return Value;
+  };
+
   switch (unsigned(Kind)) {
   case SystemZ::FK_390_PC12DBL:
     return handlePCRelFixupValue(12);
@@ -91,12 +97,18 @@ static uint64_t extractBitsForFixup(MCFixupKind Kind, uint64_t Value,
     return handleImmValue(false, 4);
   case SystemZ::FK_390_U8Imm:
     return handleImmValue(false, 8);
+  case SystemZ::FK_390_X8Imm:
+    return handleXImmValue(8);
   case SystemZ::FK_390_U12Imm:
     return handleImmValue(false, 12);
   case SystemZ::FK_390_U16Imm:
     return handleImmValue(false, 16);
+  case SystemZ::FK_390_X16Imm:
+    return handleXImmValue(16);
   case SystemZ::FK_390_U32Imm:
     return handleImmValue(false, 32);
+  case SystemZ::FK_390_X32Imm:
+    return handleXImmValue(32);
   case SystemZ::FK_390_U48Imm:
     return handleImmValue(false, 48);
   }
diff --git a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCFixups.h b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCFixups.h
index 1ff4217018f1f..aa8ca7e2312d0 100644
--- a/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCFixups.h
+++ b/llvm/lib/Target/SystemZ/MCTargetDesc/SystemZMCFixups.h
@@ -36,6 +36,10 @@ enum FixupKind {
   FK_390_U32Imm,
   FK_390_U48Imm,
 
+  FK_390_X8Imm,
+  FK_390_X16Imm,
+  FK_390_X32Imm,
+
   // Marker
   LastTargetFixupKind,
   NumTargetFixupKinds = LastTargetFixupKind - FirstTargetFixupKind
@@ -61,6 +65,9 @@ const static MCFixupKindInfo MCFixupKindInfos[SystemZ::NumTargetFixupKinds] = {
     {"FK_390_U16Imm",  0, 16, 0},
     {"FK_390_U32Imm",  0, 32, 0},
     {"FK_390_U48Imm",  0, 48, 0},
+    {"FK_390_X8Imm",  0, 8, 0},
+    {"FK_390_X16Imm",  0, 16, 0},
+    {"FK_390_X32Imm",  0, 32, 0},
 };
 // clang-format on
 } // end namespace SystemZ
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrFormats.td b/llvm/lib/Target/SystemZ/SystemZInstrFormats.td
index 82415f412509f..00452377bbf5f 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrFormats.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrFormats.td
@@ -1768,26 +1768,129 @@ class DirectiveInsnE<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst = enc;
 }
 
-class DirectiveInsnRI<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRIa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnI<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstI<0, outs, ins, asmstr, pattern> {
+  bits<16> enc;
+
+  let Inst{15 -8} = enc{15 -8};
+}
+
+class DirectiveInsnIE<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstIE<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -16} = enc{31 -16};
+}
+
+class DirectiveInsnMII<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstMII<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
+class DirectiveInsnRIa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIa<0, outs, ins, asmstr, pattern> {
   bits<32> enc;
 
   let Inst{31-24} = enc{31-24};
   let Inst{19-16} = enc{19-16};
 }
 
-class DirectiveInsnRIE<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRIEd<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRIb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIb<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -24} = enc{31 -24};
+  let Inst{19 -16} = enc{19 -16};
+}
+
+class DirectiveInsnRIc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIc<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -24} = enc{31 -24};
+  let Inst{19 -16} = enc{19 -16};
+}
+
+class DirectiveInsnRIEa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRIEb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRIEc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEc<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRIEd<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEd<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
   let Inst{7-0}   = enc{7-0};
 }
 
-class DirectiveInsnRIL<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRILa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRIEe<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEe<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRIEf<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEf<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
-  string type;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRIEg<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRIEg<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRILa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRILa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+  // string type;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{35 -32} = enc{35 -32};
+}
+
+class DirectiveInsnRILb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRILb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+  // string type;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{35 -32} = enc{35 -32};
+}
+
+class DirectiveInsnRILc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRILc<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+  // string type;
 
   let Inst{47-40} = enc{47-40};
   let Inst{35-32} = enc{35-32};
@@ -1808,6 +1911,13 @@ class DirectiveInsnRR<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{15-8} = enc{15-8};
 }
 
+class DirectiveInsnRRD<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRRD<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -16} = enc{31 -16};
+}
+
 class DirectiveInsnRRE<dag outs, dag ins, string asmstr, list<dag> pattern>
   : InstRRE<0, outs, ins, asmstr, pattern> {
   bits<32> enc;
@@ -1815,13 +1925,36 @@ class DirectiveInsnRRE<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{31-16} = enc{31-16};
 }
 
-class DirectiveInsnRRF<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRRFa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRRFa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRRFa<0, outs, ins, asmstr, pattern> {
   bits<32> enc;
 
   let Inst{31-16} = enc{31-16};
 }
 
+// RRF-b is identical to RRF-a, and is thus omitted
+
+class DirectiveInsnRRFc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRRFc<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -16} = enc{31 -16};
+}
+
+class DirectiveInsnRRFd<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRRFd<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -16} = enc{31 -16};
+}
+
+class DirectiveInsnRRFe<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRRFe<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -16} = enc{31 -16};
+}
+
 class DirectiveInsnRRS<dag outs, dag ins, string asmstr, list<dag> pattern>
   : InstRRS<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
@@ -1830,13 +1963,20 @@ class DirectiveInsnRRS<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{7-0}   = enc{7-0};
 }
 
-class DirectiveInsnRS<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRSa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRSa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRSa<0, outs, ins, asmstr, pattern> {
   bits<32> enc;
 
   let Inst{31-24} = enc{31-24};
 }
 
+class DirectiveInsnRSb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRSb<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -24} = enc{31 -24};
+}
+
 class DirectiveInsnRSE<dag outs, dag ins, string asmstr, list<dag> pattern>
   : InstRSEa<6, outs, ins, asmstr, pattern> {
   bits <48> enc;
@@ -1852,21 +1992,52 @@ class DirectiveInsnRSI<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{31-24} = enc{31-24};
 }
 
-class DirectiveInsnRSY<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRSYa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRSLa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRSLa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRSLb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRSLb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRSYa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRSYa<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
   let Inst{7-0}   = enc{7-0};
 }
 
-class DirectiveInsnRX<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRXa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRSYb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRSYb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRXa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRXa<0, outs, ins, asmstr, pattern> {
   bits<32> enc;
 
   let Inst{31-24} = enc{31-24};
 }
 
+class DirectiveInsnRXb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRXb<0, outs, ins, asmstr, pattern> {
+  bits<32> enc;
+
+  let Inst{31 -24} = enc{31 -24};
+}
+
 class DirectiveInsnRXE<dag outs, dag ins, string asmstr, list<dag> pattern>
   : InstRXE<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
@@ -1885,8 +2056,24 @@ class DirectiveInsnRXF<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{7-0}   = enc{7-0};
 }
 
-class DirectiveInsnRXY<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRXYa<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnRXYa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRXYa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRXYb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRXYb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnRXYc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstRXYa<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
@@ -1922,13 +2109,55 @@ class DirectiveInsnSIL<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{47-32} = enc{47-32};
 }
 
-class DirectiveInsnSS<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstSSd<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnSMI<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSMI<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
+class DirectiveInsnSSa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSSa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
+class DirectiveInsnSSb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSSb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
+class DirectiveInsnSSc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSSc<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
+class DirectiveInsnSSd<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSSd<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
 }
 
+class DirectiveInsnSSe<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSSe<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
+class DirectiveInsnSSf<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstSSf<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+}
+
 class DirectiveInsnSSE<dag outs, dag ins, string asmstr, list<dag> pattern>
   : InstSSE<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
@@ -1944,30 +2173,222 @@ class DirectiveInsnSSF<dag outs, dag ins, string asmstr, list<dag> pattern>
   let Inst{35-32} = enc{35-32};
 }
 
-class DirectiveInsnVRI<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstVRIe<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnVRIa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIc<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRId<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRId<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIe<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIe<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
   let Inst{7-0}   = enc{7-0};
 }
 
-class DirectiveInsnVRR<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstVRRc<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnVRIf<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIf<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIg<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIg<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIh<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIh<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIi<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIi<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIj<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIj<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIk<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIk<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRIl<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRIl<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRc<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
   let Inst{7-0}   = enc{7-0};
 }
 
-class DirectiveInsnVRS<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstVRSc<0, outs, ins, asmstr, pattern> {
+class DirectiveInsnVRRd<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRd<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRe<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRe<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRf<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRf<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRg<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRg<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRh<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRh<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRi<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRi<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRj<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRj<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRRk<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRRk<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRSa<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRSa<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRSb<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRSb<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
+class DirectiveInsnVRSc<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRSc<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
 
   let Inst{47-40} = enc{47-40};
   let Inst{7-0}   = enc{7-0};
 }
 
+class DirectiveInsnVRSd<dag outs, dag ins, string asmstr, list<dag> pattern>
+    : InstVRSd<0, outs, ins, asmstr, pattern> {
+  bits<48> enc;
+
+  let Inst{47 -40} = enc{47 -40};
+  let Inst{7 -0} = enc{7 -0};
+}
+
 class DirectiveInsnVRV<dag outs, dag ins, string asmstr, list<dag> pattern>
   : InstVRV<0, outs, ins, asmstr, pattern> {
   bits<48> enc;
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
index f53716a663ed8..73708d3a4e0b3 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
@@ -2277,42 +2277,140 @@ let hasSideEffects = 1 in {
 
 let isCodeGenOnly = 1, hasSideEffects = 1 in {
   def InsnE   : DirectiveInsnE<(outs), (ins imm64zx16:$enc), ".insn e,$enc", []>;
-  def InsnRI  : DirectiveInsnRI<(outs), (ins imm64zx32:$enc, AnyReg:$R1,
-                                             imm32sx16:$I2),
+  def InsnI : DirectiveInsnI<(outs), (ins imm64zx16:$enc, imm32zx8:$I1),
+                             ".insn i,$enc,$I1", []>;
+  def InsnIE : DirectiveInsnIE<(outs),
+                               (ins imm64zx32:$enc, imm32zx4:$I1, imm32zx4:$I2),
+                               ".insn ie,$enc,$I1,$I2", []>;
+  def InsnMII : DirectiveInsnMII<(outs),
+                                 (ins imm64zx48:$enc, imm32zx4:$M1,
+                                     brtarget12bpp:$RI2, brtarget24bpp:$RI3),
+                                 ".insn mii,$enc,$M1,$RI2,$RI3", []>;
+  def InsnRI : DirectiveInsnRIa<(outs),
+                                (ins imm64zx32:$enc, AnyReg:$R1, imm32sx16:$I2),
                                 ".insn ri,$enc,$R1,$I2", []>;
-  def InsnRIE : DirectiveInsnRIE<(outs), (ins imm64zx48:$enc, AnyReg:$R1,
-                                              AnyReg:$R3, brtarget16:$I2),
-                                 ".insn rie,$enc,$R1,$R3,$I2", []>;
-  def InsnRIL : DirectiveInsnRIL<(outs), (ins imm64zx48:$enc, AnyReg:$R1,
-                                              brtarget32:$I2),
-                                 ".insn ril,$enc,$R1,$I2", []>;
-  def InsnRILU : DirectiveInsnRIL<(outs), (ins imm64zx48:$enc, AnyReg:$R1,
-                                               uimm32:$I2),
-                                  ".insn rilu,$enc,$R1,$I2", []>;
-  def InsnRIS : DirectiveInsnRIS<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                      imm32sx8:$I2, imm32zx4:$M3,
-                                      (bdaddr12only $B4, $D4):$BD4),
-                                 ".insn ris,$enc,$R1,$I2,$M3,$BD4", []>;
+  def InsnRIa
+      : DirectiveInsnRIa<(outs),
+                         (ins imm64zx32:$enc, AnyReg:$R1, imm32xx16:$I2),
+                         ".insn ri_a,$enc,$R1,$I2", []>;
+  def InsnRIb
+      : DirectiveInsnRIb<(outs),
+                         (ins imm64zx32:$enc, AnyReg:$R1, brtarget16:$RI2),
+                         ".insn ri_b,$enc,$R1,$RI2", []>;
+  def InsnRIc
+      : DirectiveInsnRIc<(outs),
+                         (ins imm64zx32:$enc, imm32zx4:$M1, brtarget16:$RI2),
+                         ".insn ri_c,$enc,$M1,$RI2", []>;
+  def InsnRIE : DirectiveInsnRIEd<(outs),
+                                  (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
+                                      brtarget16:$I2),
+                                  ".insn rie,$enc,$R1,$R3,$I2", []>;
+  def InsnRIEa : DirectiveInsnRIEa<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       imm32xx16:$I2, imm32zx4:$M3),
+                                   ".insn rie_a,$enc,$R1,$I2,$M3", []>;
+  def InsnRIEb : DirectiveInsnRIEb<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2,
+                                       imm32zx4:$M3, brtarget16:$RI4),
+                                   ".insn rie_b,$enc,$R1,$R2,$M3,$RI4", []>;
+  def InsnRIEc
+      : DirectiveInsnRIEc<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1, imm32xx8:$I2,
+                              imm32zx4:$M3, brtarget16:$RI4),
+                          ".insn rie_c,$enc,$R1,$I2,$M3,$RI4", []>;
+  def InsnRIEd
+      : DirectiveInsnRIEd<
+            (outs), (ins imm64zx48:$enc, AnyReg:$R1, imm32sx16:$I2, AnyReg:$R3),
+            ".insn rie_d,$enc,$R1,$I2,$R3", []>;
+  def InsnRIEe : DirectiveInsnRIEe<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       brtarget16:$RI2, AnyReg:$R3),
+                                   ".insn rie_e,$enc,$R1,$RI2,$R3", []>;
+  def InsnRIEf
+      : DirectiveInsnRIEf<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2,
+                              imm32zx8:$I3, imm32zx8:$I4, imm32zx8:$I5),
+                          ".insn rie_f,$enc,$R1,$R2,$I3,$I4,$I5", []>;
+  def InsnRIEg : DirectiveInsnRIEg<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       imm32sx16:$I2, imm32zx4:$M3),
+                                   ".insn rie_g,$enc,$R1,$I2,$M3", []>;
+  def InsnRIL
+      : DirectiveInsnRILa<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1, brtarget32:$I2),
+                          ".insn ril,$enc,$R1,$I2", []>;
+  def InsnRILa
+      : DirectiveInsnRILa<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1, imm64xx32:$I2),
+                          ".insn ril_a,$enc,$R1,$I2", []>;
+  def InsnRILb
+      : DirectiveInsnRILb<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1, brtarget32:$RI2),
+                          ".insn ril_b,$enc,$R1,$RI2", []>;
+  def InsnRILc
+      : DirectiveInsnRILc<(outs),
+                          (ins imm64zx48:$enc, imm32zx4:$M1, brtarget32:$RI2),
+                          ".insn ril_c,$enc,$M1,$RI2", []>;
+  def InsnRILU
+      : DirectiveInsnRILa<(outs), (ins imm64zx48:$enc, AnyReg:$R1, uimm32:$I2),
+                          ".insn rilu,$enc,$R1,$I2", []>;
+  def InsnRIS
+      : DirectiveInsnRIS<(outs),
+                         (ins imm64zx48:$enc, AnyReg:$R1, imm32xx8:$I2,
+                             imm32zx4:$M3, (bdaddr12only $B4, $D4):$BD4),
+                         ".insn ris,$enc,$R1,$I2,$M3,$BD4", []>;
   def InsnRR : DirectiveInsnRR<(outs),
                                (ins imm64zx16:$enc, AnyReg:$R1, AnyReg:$R2),
                                ".insn rr,$enc,$R1,$R2", []>;
+  def InsnRRD
+      : DirectiveInsnRRD<
+            (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3),
+            ".insn rrd,$enc,$R1,$R2,%R3", []>;
   def InsnRRE : DirectiveInsnRRE<(outs), (ins imm64zx32:$enc,
                                               AnyReg:$R1, AnyReg:$R2),
                                  ".insn rre,$enc,$R1,$R2", []>;
-  def InsnRRF : DirectiveInsnRRF<(outs),
-                                 (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
+  def InsnRRF : DirectiveInsnRRFa<(outs),
+                                  (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
                                       AnyReg:$R3, imm32zx4:$M4),
-                                 ".insn rrf,$enc,$R1,$R2,$R3,$M4", []>;
+                                  ".insn rrf,$enc,$R1,$R2,$R3,$M4", []>;
+  def InsnRRFa : DirectiveInsnRRFa<(outs),
+                                   (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
+                                       AnyReg:$R3, imm32zx4:$M4),
+                                   ".insn rrf_a,$enc,$R1,$R2,$R3,$M4", []>;
+  def InsnRRFb : DirectiveInsnRRFa<(outs),
+                                   (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
+                                       AnyReg:$R3, imm32zx4:$M4),
+                                   ".insn rrf_b,$enc,$R1,$R2,$R3,$M4", []>;
+  def InsnRRFc
+      : DirectiveInsnRRFc<
+            (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M3),
+            ".insn rrf_c,$enc,$R1,$R2,$M3", []>;
+  def InsnRRFd
+      : DirectiveInsnRRFd<
+            (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M4),
+            ".insn rrf_d,$enc,$R1,$R2,$M4", []>;
+  def InsnRRFe : DirectiveInsnRRFe<(outs),
+                                   (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
+                                       imm32zx4:$M3, imm32zx4:$M4),
+                                   ".insn rrf_e,$enc,$R1,$R2,$M3,$M4", []>;
   def InsnRRS : DirectiveInsnRRS<(outs),
                                  (ins imm64zx48:$enc, AnyReg:$R1,
                                       AnyReg:$R2, imm32zx4:$M3,
                                       (bdaddr12only $B4, $D4):$BD4),
                                  ".insn rrs,$enc,$R1,$R2,$M3,$BD4", []>;
-  def InsnRS  : DirectiveInsnRS<(outs),
-                                (ins imm64zx32:$enc, AnyReg:$R1,
-                                     AnyReg:$R3, (bdaddr12only $B2, $D2):$BD2),
+  def InsnRS : DirectiveInsnRSa<(outs),
+                                (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R3,
+                                    (bdaddr12only $B2, $D2):$BD2),
                                 ".insn rs,$enc,$R1,$R3,$BD2", []>;
+  def InsnRSa : DirectiveInsnRSa<(outs),
+                                 (ins imm64zx32:$enc, AnyReg:$R1,
+                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                                 ".insn rs_a,$enc,$R1,$BD2,$R3", []>;
+  def InsnRSb
+      : DirectiveInsnRSb<(outs),
+                         (ins imm64zx32:$enc, AnyReg:$R1,
+                             (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M3),
+                         ".insn rs_b,$enc,$R1,$BD2,$M3", []>;
   def InsnRSE : DirectiveInsnRSE<(outs),
                                  (ins imm64zx48:$enc, AnyReg:$R1,
                                       AnyReg:$R3, (bdaddr12only $B2, $D2):$BD2),
@@ -2321,13 +2419,41 @@ let isCodeGenOnly = 1, hasSideEffects = 1 in {
                                  (ins imm64zx48:$enc, AnyReg:$R1,
                                       AnyReg:$R3, brtarget16:$RI2),
                                  ".insn rsi,$enc,$R1,$R3,$RI2", []>;
-  def InsnRSY : DirectiveInsnRSY<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                      AnyReg:$R3, (bdaddr20only $B2, $D2):$BD2),
-                                 ".insn rsy,$enc,$R1,$R3,$BD2", []>;
-  def InsnRX  : DirectiveInsnRX<(outs), (ins imm64zx32:$enc, AnyReg:$R1,
-                                             (bdxaddr12only $B2, $D2, $X2):$XBD2),
+  def InsnRSLa : DirectiveInsnRSLa<(outs),
+                                   (ins imm64zx48:$enc, (bdladdr12onlylen4 $B1,
+                                                            $D1, $L1):$BDL1),
+                                   ".insn rsl_a,$enc,$BDL1", []>;
+  def InsnRSLb : DirectiveInsnRSLb<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       (bdladdr12onlylen8 $B2, $D2, $L2):$BDL2,
+                                       imm32zx4:$M3),
+                                   ".insn rsl_b,$enc,$R1,$BDL2,$M3", []>;
+  def InsnRSY : DirectiveInsnRSYa<(outs),
+                                  (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
+                                      (bdaddr20only $B2, $D2):$BD2),
+                                  ".insn rsy,$enc,$R1,$R3,$BD2", []>;
+  def InsnRSYa
+      : DirectiveInsnRSYa<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1,
+                              (bdaddr20only $B2, $D2):$BD2, AnyReg:$R3),
+                          ".insn rsy_a,$enc,$R1,$BD2,$R3", []>;
+  def InsnRSYb
+      : DirectiveInsnRSYb<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1,
+                              (bdaddr20only $B2, $D2):$BD2, imm32zx4:$M3),
+                          ".insn rsy_b,$enc,$R1,$BD2,$M3", []>;
+  def InsnRX : DirectiveInsnRXa<(outs),
+                                (ins imm64zx32:$enc, AnyReg:$R1,
+                                    (bdxaddr12only $B2, $D2, $X2):$XBD2),
                                 ".insn rx,$enc,$R1,$XBD2", []>;
+  def InsnRXa : DirectiveInsnRXa<(outs),
+                                 (ins imm64zx32:$enc, AnyReg:$R1,
+                                     (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                                 ".insn rx_a,$enc,$R1,$XBD2", []>;
+  def InsnRXb : DirectiveInsnRXb<(outs),
+                                 (ins imm64zx32:$enc, imm32zx4:$M1,
+                                     (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                                 ".insn rx_b,$enc,$M1,$XBD2", []>;
   def InsnRXE : DirectiveInsnRXE<(outs), (ins imm64zx48:$enc, AnyReg:$R1,
                                               (bdxaddr12only $B2, $D2, $X2):$XBD2),
                                  ".insn rxe,$enc,$R1,$XBD2", []>;
@@ -2335,28 +2461,80 @@ let isCodeGenOnly = 1, hasSideEffects = 1 in {
                                  (ins imm64zx48:$enc, AnyReg:$R1,
                                       AnyReg:$R3, (bdxaddr12only $B2, $D2, $X2):$XBD2),
                                  ".insn rxf,$enc,$R1,$R3,$XBD2", []>;
-  def InsnRXY : DirectiveInsnRXY<(outs), (ins imm64zx48:$enc, AnyReg:$R1,
-                                              (bdxaddr20only $B2, $D2, $X2):$XBD2),
-                                 ".insn rxy,$enc,$R1,$XBD2", []>;
+  def InsnRXY : DirectiveInsnRXYa<(outs),
+                                  (ins imm64zx48:$enc, AnyReg:$R1,
+                                      (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                                  ".insn rxy,$enc,$R1,$XBD2", []>;
+  def InsnRXYa : DirectiveInsnRXYa<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                                   ".insn rxy_a,$enc,$R1,$XBD2", []>;
+  def InsnRXYb : DirectiveInsnRXYb<(outs),
+                                   (ins imm64zx48:$enc, imm32zx4:$M1,
+                                       (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                                   ".insn rxy_b,$enc,$M1,$XBD2", []>;
+  def InsnRXYc : DirectiveInsnRXYa<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                                   ".insn rxy_c,$enc,$R1,$XBD2", []>;
   def InsnS : DirectiveInsnS<(outs),
                              (ins imm64zx32:$enc, (bdaddr12only $B2, $D2):$BD2),
                              ".insn s,$enc,$BD2", []>;
   def InsnSI : DirectiveInsnSI<(outs),
-                               (ins imm64zx32:$enc, (bdaddr12only $B1, $D1):$BD1,
-                                    imm32sx8:$I2),
+                               (ins imm64zx32:$enc,
+                                   (bdaddr12only $B1, $D1):$BD1, imm32xx8:$I2),
                                ".insn si,$enc,$BD1,$I2", []>;
-  def InsnSIY : DirectiveInsnSIY<(outs),
-                                 (ins imm64zx48:$enc,
-                                      (bdaddr20only $B1, $D1):$BD1, imm32zx8:$I2),
-                                 ".insn siy,$enc,$BD1,$I2", []>;
-  def InsnSIL : DirectiveInsnSIL<(outs),
-                                 (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
-                                      imm32zx16:$I2),
-                                 ".insn sil,$enc,$BD1,$I2", []>;
-  def InsnSS : DirectiveInsnSS<(outs),
-                               (ins imm64zx48:$enc, (bdraddr12only $B1, $D1, $R1):$RBD1,
+  def InsnSIY
+      : DirectiveInsnSIY<(outs),
+                         (ins imm64zx48:$enc, (bdaddr20only $B1, $D1):$BD1,
+                             imm32xx8:$I2),
+                         ".insn siy,$enc,$BD1,$I2", []>;
+  def InsnSIL
+      : DirectiveInsnSIL<(outs),
+                         (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
+                             imm32xx16:$I2),
+                         ".insn sil,$enc,$BD1,$I2", []>;
+  def InsnSMI
+      : DirectiveInsnSMI<(outs),
+                         (ins imm64zx48:$enc, imm32zx4:$M1, brtarget16bpp:$RI2,
+                             (bdaddr12only $B3, $D3):$BD3),
+                         ".insn smi,$enc,$M1,$RI2,$BD3", []>;
+  def InsnSS : DirectiveInsnSSd<(outs),
+                                (ins imm64zx48:$enc,
+                                    (bdraddr12only $B1, $D1, $R1):$RBD1,
                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
-                               ".insn ss,$enc,$RBD1,$BD2,$R3", []>;
+                                ".insn ss,$enc,$RBD1,$BD2,$R3", []>;
+  def InsnSSa : DirectiveInsnSSa<(outs),
+                                 (ins imm64zx48:$enc,
+                                     (bdladdr12onlylen8 $B1, $D1, $L1):$BDL1,
+                                     (bdaddr12only $B2, $D2):$BD2),
+                                 ".insn ss_a,$enc,$BDL1,$BD2", []>;
+  def InsnSSb : DirectiveInsnSSb<(outs),
+                                 (ins imm64zx48:$enc,
+                                     (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1,
+                                     (bdladdr12onlylen4 $B2, $D2, $L2):$BDL2),
+                                 ".insn ss_b,$enc,$BDL1,$BDL2", []>;
+  def InsnSSc
+      : DirectiveInsnSSc<(outs),
+                         (ins imm64zx48:$enc,
+                             (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1,
+                             (bdaddr12only $B2, $D2):$BD2, imm32zx4:$I3),
+                         ".insn ss_c,$enc,$BDL1,$BD2,$I3", []>;
+  def InsnSSd : DirectiveInsnSSd<(outs),
+                                 (ins imm64zx48:$enc,
+                                     (bdraddr12only $B1, $D1, $R1):$RBD1,
+                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                                 ".insn ss_d,$enc,$RBD1,$BD2,$R3", []>;
+  def InsnSSe : DirectiveInsnSSe<(outs),
+                                 (ins imm64zx48:$enc, AnyReg:$R1,
+                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3,
+                                     (bdaddr12only $B4, $D4):$BD4),
+                                 ".insn ss_e,$enc,$R1,$BD2,$R3,$BD4", []>;
+  def InsnSSf
+      : DirectiveInsnSSf<(outs),
+                         (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
+                             (bdladdr12onlylen8 $B2, $D2, $L2):$BDL2),
+                         ".insn ss_f,$enc,$BD1,$BDL2", []>;
   def InsnSSE : DirectiveInsnSSE<(outs),
                                  (ins imm64zx48:$enc,
                                       (bdaddr12only $B1, $D1):$BD1,(bdaddr12only $B2, $D2):$BD2),
@@ -2365,19 +2543,140 @@ let isCodeGenOnly = 1, hasSideEffects = 1 in {
                                  (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
                                       (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
                                  ".insn ssf,$enc,$BD1,$BD2,$R3", []>;
-  def InsnVRI : DirectiveInsnVRI<(outs),
-                                 (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                  imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
-                                 ".insn vri,$enc,$V1,$V2,$I3,$M4,$M5", []>;
-  def InsnVRR : DirectiveInsnVRR<(outs),
-                                 (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                  VR128:$V3, imm32zx4:$M4, imm32zx4:$M5,
-                                  imm32zx4:$M6),
-                                  ".insn vrr,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>;
-  def InsnVRS : DirectiveInsnVRS<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V3,
-                                  (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M4),
-                                 ".insn vrs,$enc,$BD2,$M4", []>;
+  def InsnVRI
+      : DirectiveInsnVRIe<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                              imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
+                          ".insn vri,$enc,$V1,$V2,$I3,$M4,$M5", []>;
+  def InsnVRIa : DirectiveInsnVRIa<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1,
+                                       imm32xx16:$I2, imm32zx4:$M3),
+                                   ".insn vri_a,$enc,$V1,$I2,$M3", []>;
+  def InsnVRIb : DirectiveInsnVRIb<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, imm32zx8:$I2,
+                                       imm32zx8:$I3, imm32zx4:$M4),
+                                   ".insn vri_b,$enc,$V1,$I2,$I3,$M4", []>;
+  def InsnVRIc : DirectiveInsnVRIc<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1,
+                                       imm32zx16:$I2, VR128:$V3, imm32zx4:$M4),
+                                   ".insn vri_c,$enc,$V1,$I2,$V3,$M4", []>;
+  def InsnVRId : DirectiveInsnVRId<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                                       VR128:$V3, imm32zx8:$I4, imm32zx4:$M5),
+                                   ".insn vri_d,$enc,$V1,$V2,$V3,$I4,$M5", []>;
+  def InsnVRIe
+      : DirectiveInsnVRIe<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                              imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
+                          ".insn vri_e,$enc,$V1,$V2,$I3,$M4,$M5", []>;
+  def InsnVRIf : DirectiveInsnVRIf<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                                       VR128:$V3, imm32zx8:$I4, imm32zx4:$M5),
+                                   ".insn vri_f,$enc,$V1,$V2,$V3,$I4,$M5", []>;
+  def InsnVRIg
+      : DirectiveInsnVRIg<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                              imm32zx8:$I3, imm32zx16:$I4, imm32zx4:$M5),
+                          ".insn vri_g,$enc,$V1,$V2,$I3,$I4,$M5", []>;
+  def InsnVRIh
+      : DirectiveInsnVRIh<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2,
+                              imm32zx4:$I3, imm32zx4:$M4),
+                          ".insn vri_h,$enc,$V1,$I2,$I3,$M4", []>;
+  def InsnVRIi : DirectiveInsnVRIi<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, AnyReg:$R2,
+                                       imm32zx8:$I3, imm32zx4:$M4),
+                                   ".insn vri_i,$enc,$V1,$R2,$I3,$M4", []>;
+  def InsnVRIj : DirectiveInsnVRIj<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                                       imm32zx8:$I3, imm32zx4:$M4),
+                                   ".insn vri_j,$enc,$V1,$V2,$I3,$M4", []>;
+  def InsnVRIk : DirectiveInsnVRIk<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                                       VR128:$V3, VR128:$V4, imm32zx8:$I5),
+                                   ".insn vri_k,$enc,$V1,$V2,$V3,$V4,$I5", []>;
+  def InsnVRIl
+      : DirectiveInsnVRIl<
+            (outs), (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx16:$I3),
+            ".insn vri_l,$enc,$V1,$V2,$I3", []>;
+  def InsnVRR
+      : DirectiveInsnVRRc<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                              imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
+                          ".insn vrr,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>;
+  def InsnVRRa
+      : DirectiveInsnVRRa<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                              imm32zx4:$M3, imm32zx4:$M4, imm32zx4:$M5),
+                          ".insn vrr_a,$enc,$V1,$V2,$M3,$M4,$M5", []>;
+  def InsnVRRb : DirectiveInsnVRRb<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                                       VR128:$V3, imm32zx4:$M4, imm32zx4:$M5),
+                                   ".insn vrr_b,$enc,$V1,$V2,$V3,$M4,$M5", []>;
+  def InsnVRRc
+      : DirectiveInsnVRRc<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                              imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
+                          ".insn vrr_c,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>;
+  def InsnVRRd
+      : DirectiveInsnVRRd<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                              VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
+                          ".insn vrr_d,$enc,$V1,$V2,$V3,$V4,$M5,$M6", []>;
+  def InsnVRRe
+      : DirectiveInsnVRRe<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                              VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
+                          ".insn vrr_e,$enc,$V1,$V2,$V3,$V4,$M5,$M6", []>;
+  def InsnVRRf
+      : DirectiveInsnVRRf<
+            (outs), (ins imm64zx48:$enc, VR128:$V1, AnyReg:$R2, AnyReg:$R3),
+            ".insn vrr_f,$enc,$V1,$R2,$R3", []>;
+  def InsnVRRg
+      : DirectiveInsnVRRg<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2),
+                          ".insn vrr_g,$enc,$V1,$I2", []>;
+  def InsnVRRh
+      : DirectiveInsnVRRh<
+            (outs), (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3),
+            ".insn vrr_h,$enc,$V1,$V2,$M3", []>;
+  def InsnVRRi : DirectiveInsnVRRi<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V2,
+                                       imm32zx4:$M3, imm32zx4:$M4),
+                                   ".insn vrr_i,$enc,$R1,$V2,$M3", []>;
+  def InsnVRRj : DirectiveInsnVRRj<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                                       VR128:$V3, imm32zx4:$M4),
+                                   ".insn vrr_j,$enc,$V1,$V2,$V3,$M4", []>;
+  def InsnVRRk
+      : DirectiveInsnVRRk<
+            (outs), (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3),
+            ".insn vrr_k,$enc,$V1,$V2,$M3", []>;
+  def InsnVRS
+      : DirectiveInsnVRSc<(outs),
+                          (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V3,
+                              (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M4),
+                          ".insn vrs,$enc,$R1,$V3,$BD2,$M4", []>;
+  def InsnVRSa : DirectiveInsnVRSa<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1,
+                                       (bdaddr12only $B2, $D2):$BD2, VR128:$V3,
+                                       imm32zx4:$M4),
+                                   ".insn_a vrs_a,$enc,$V1,$BD2,$V3,$M4", []>;
+  def InsnVRSb : DirectiveInsnVRSb<(outs),
+                                   (ins imm64zx48:$enc, VR128:$V1,
+                                       (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3,
+                                       imm32zx4:$M4),
+                                   ".insn vrs_b,$enc,$V1,$BD2,$R3,$M4", []>;
+  def InsnVRSc : DirectiveInsnVRSc<(outs),
+                                   (ins imm64zx48:$enc, AnyReg:$R1,
+                                       (bdaddr12only $B2, $D2):$BD2, VR128:$V3,
+                                       imm32zx4:$M4),
+                                   ".insn vrs_c,$enc,$R1,$BD2,$V3,$M4", []>;
+  def InsnVRSd
+      : DirectiveInsnVRSd<(outs),
+                          (ins imm64zx48:$enc, VR128:$V1,
+                              (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                          ".insn vrs_d,$enc,$V1,$BD2,$R3", []>;
   def InsnVRV : DirectiveInsnVRV<(outs),
                                  (ins imm64zx48:$enc, VR128:$V1,
                                       (bdvaddr12only $B2, $D2, $V2):$VBD2, imm32zx4:$M3),
diff --git a/llvm/lib/Target/SystemZ/SystemZOperands.td b/llvm/lib/Target/SystemZ/SystemZOperands.td
index 8a2049c518473..f0ab67e421149 100644
--- a/llvm/lib/Target/SystemZ/SystemZOperands.td
+++ b/llvm/lib/Target/SystemZ/SystemZOperands.td
@@ -302,11 +302,14 @@ def U3Imm  : ImmediateAsmOperand<"U3Imm">;
 def U4Imm  : ImmediateAsmOperand<"U4Imm">;
 def S8Imm  : ImmediateAsmOperand<"S8Imm">;
 def U8Imm  : ImmediateAsmOperand<"U8Imm">;
+def X8Imm : ImmediateAsmOperand<"X8Imm">;
 def U12Imm : ImmediateAsmOperand<"U12Imm">;
 def S16Imm : ImmediateAsmOperand<"S16Imm">;
 def U16Imm : ImmediateAsmOperand<"U16Imm">;
+def X16Imm : ImmediateAsmOperand<"X16Imm">;
 def S32Imm : ImmediateAsmOperand<"S32Imm">;
 def U32Imm : ImmediateAsmOperand<"U32Imm">;
+def X32Imm : ImmediateAsmOperand<"X32Imm">;
 def U48Imm : ImmediateAsmOperand<"U48Imm">;
 
 //===----------------------------------------------------------------------===//
@@ -366,6 +369,11 @@ defm imm32zx8 : Immediate<i32, [{
   return Imm.isIntN(8);
 }], UIMM8, "U8Imm">;
 
+// Disable for codegen - only relevant for .insn directives.
+defm imm32xx8 : Immediate<i32, [{
+  return false;
+}], UIMM8, "X8Imm">;
+
 defm imm32zx8trunc : Immediate<i32, [{}], UIMM8, "U8Imm">;
 
 // Immediates for the 8-bit LSB chunk of an i32, with the other bits being one.
@@ -397,6 +405,11 @@ defm imm32zx16 : Immediate<i32, [{
   return Imm.isIntN(16);
 }], UIMM16, "U16Imm">;
 
+// Disable for codegen - only relevant for .insn directives.
+defm imm32xx16 : Immediate<i32, [{
+  return false;
+}], UIMM16, "X16Imm">;
+
 defm imm32sx16trunc : Immediate<i32, [{}], SIMM16, "S16Imm">;
 defm imm32zx16trunc : Immediate<i32, [{}], UIMM16, "U16Imm">;
 
@@ -543,6 +556,11 @@ defm imm64zx32 : Immediate<i64, [{
   return Imm.isIntN(32);
 }], UIMM32, "U32Imm">;
 
+// Disable for codegen - only relevant for .insn directives.
+defm imm64xx32 : Immediate<i64, [{
+  return false;
+}], UIMM32, "X32Imm">;
+
 defm imm64zx32n : Immediate<i64, [{
   return (-Imm).isIntN(32);
 }], NEGUIMM32, "U32Imm">;
diff --git a/llvm/test/MC/SystemZ/directive-insn-z13.s b/llvm/test/MC/SystemZ/directive-insn-z13.s
new file mode 100644
index 0000000000000..19d5e6dd76e1f
--- /dev/null
+++ b/llvm/test/MC/SystemZ/directive-insn-z13.s
@@ -0,0 +1,59 @@
+# RUN: llvm-mc -triple s390x-linux-gnu -mcpu=z13 -filetype=obj %s | \
+# RUN: llvm-objdump --mcpu=z13 -d - | FileCheck %s
+
+# Test the .insn directive which provides a way of encoding an instruction
+# directly. It takes a format, encoding, and operands based on the format.
+# This file covers instruction formats newly supported.
+
+label.START:
+#CHECK: ec 12 af fe 00 42    	lochih	%r1, -20482
+      .insn rie_g,0xec0000000042,%r1,-20482,2
+
+#CHECK: ed 12 34 56 78 ae    	cdpt	%f7, 1110(19,%r3), 8
+      .insn rsl_b,0xed00000000ae,%r7,1110(19,%r3),8
+
+#CHECK: eb 12 34 56 78 23    	clth	%r1, 492630(%r3)
+      .insn rsy_b,0xeb0000000023,%r1,492630(%r3),2
+
+#CHECK: c7 00 12 34 56 78     bpp 0, 0xad02, 564(%r1)
+      .insn smi,0xc70000000000,0,44272,564(%r1)
+
+#CHECK: e7 10 23 45 00 44      vgbm %v1, 9029
+      .insn vri_a,0xe70000000044,%v1,9029,0
+
+#CHECK: e7 10 ff fc 00 44      vgbm %v1, 65532
+      .insn vri_a,0xe70000000044,%v1,-4,0
+
+#CHECK: e7 10 23 45 60 46      vgm %v1, 35, 69, 6
+      .insn vri_b,0xe70000000046,%v1,35,69,6
+
+#CHECK: e7 12 34 56 70 4d      vrep %v1, %v2, 13398, 7
+      .insn vri_c,0xe7000000004d,%v1,13398,%v2,7
+
+#CHECK: e7 12 30 45 60 72      verim %v1, %v2, %v3, 69, 6
+      .insn vri_d,0xe70000000072,%v1,%v2,%v3,69,6
+
+#CHECK: e7 12 34 56 70 4a      vftci %v1, %v2, 837, 7, 6
+      .insn vri_e,0xe7000000004a,%v1,%v2,837,7,6
+
+#CHECK: e7 12 30 40 50 97      vpks %v1, %v2, %v3, 5, 4
+      .insn vrr_b,0xe70000000097,%v1,%v2,%v3,5,4
+
+#CHECK: e7 12 30 00 40 94      vpk %v1, %v2, %v3, 4
+      .insn vrr_c,0xe70000000094,%v1,%v2,%v3,4,0,0
+
+#CHECK: e7 12 34 00 50 bb      vacq %v1, %v2, %v3, %v5
+      .insn vrr_d,0xe700000000bb,%v1,%v2,%v3,%v5,4,0
+
+#CHECK: e7 12 34 05 60 8f      vfma %v1, %v2, %v3, %v6, 5, 4
+      .insn vrr_e,0xe7000000008f,%v1,%v2,%v3,%v6,5,4
+
+#CHECK: e7 12 34 56 78 36      vlm %v17, %v2, 1110(%r3), 7
+      .insn vrs_a,0xe70000000036,%v17,1110(%r3),%v2,7
+
+#CHECK: e7 12 34 56 78 22      vlvg %v17, %r2, 1110(%r3), 7
+      .insn vrs_b,0xe70000000022,%v17,1110(%r3),%r2,7
+
+#CHECK: e7 12 34 56 70 21      vlgv %r1, %v2, 1110(%r3), 7
+      .insn vrs_c,0xe70000000021,%r1,1110(%r3),%v2,7
+
diff --git a/llvm/test/MC/SystemZ/directive-insn-z14.s b/llvm/test/MC/SystemZ/directive-insn-z14.s
new file mode 100644
index 0000000000000..af0a549d78ecf
--- /dev/null
+++ b/llvm/test/MC/SystemZ/directive-insn-z14.s
@@ -0,0 +1,33 @@
+# RUN: llvm-mc -triple s390x-linux-gnu -mcpu=z14 -filetype=obj %s | \
+# RUN: llvm-objdump --mcpu=z14 -d - | FileCheck %s
+
+# Test the .insn directive which provides a way of encoding an instruction
+# directly. It takes a format, encoding, and operands based on the format.
+# This file covers instruction formats newly supported.
+
+label.START:
+#CHECK: e6 12 30 45 60 71      vap %v1, %v2, %v3, 86, 4
+      .insn vri_f,0xe60000000071,%v1,%v2,%v3,86,4
+
+
+#CHECK: e6 12 34 56 70 5b      vpsop %v1, %v2, 103, 52, 5
+      .insn vri_g,0xe6000000005b,%v1,%v2,103,52,5
+
+#CHECK: e6 10 34 56 70 49      vlip %v1, 13398, 7
+      .insn vri_h,0xe60000000049,%v1,13398,7,0
+
+#CHECK: e6 12 00 34 50 58      vcvd %v1, %r2, 69, 3
+      .insn vri_i,0xe60000000058,%v1,%r2,69,3
+
+#CHECK: e6 12 00 30 00 50      vcvb %r1, %v2, 3
+      .insn vrr_i,0xe60000000050,%r1,%v2,3,0
+
+#CHECK: e6 01 23 45 60 37      vlrlr %v6, %r1, 837(%r2)
+      .insn vrs_d,0xe60000000037,%v6,837(%r2),%r1
+
+#CHECK: e6 0f 00 00 00 5f      vtp %v15
+      .insn vrr_g,0xe6000000005f,%v15,0
+
+#CHECK: e6 01 20 30 00 77      vcp %v1, %v2, 3
+      .insn vrr_h,0xe60000000077,%v1,%v2,3
+
diff --git a/llvm/test/MC/SystemZ/directive-insn-z16.s b/llvm/test/MC/SystemZ/directive-insn-z16.s
new file mode 100644
index 0000000000000..4bf5be7e6ebe6
--- /dev/null
+++ b/llvm/test/MC/SystemZ/directive-insn-z16.s
@@ -0,0 +1,14 @@
+# RUN: llvm-mc -triple s390x-linux-gnu -mcpu=z16 -filetype=obj %s | \
+# RUN: llvm-objdump --mcpu=z16 -d - | FileCheck %s
+
+# Test the .insn directive which provides a way of encoding an instruction
+# directly. It takes a format, encoding, and operands based on the format.
+# This file covers instruction formats newly supported.
+
+label.START:
+#CHECK: e6 12 30 40 00 7d      vcsph %v1, %v2, %v3, 4
+      .insn vrr_j,0xe6000000007d,%v1,%v2,%v3,4
+
+#CHECK: e6 12 00 30 00 51      vclzdp %v1, %v2, 3
+      .insn vrr_k,0xe60000000051,%v1,%v2,3
+
diff --git a/llvm/test/MC/SystemZ/directive-insn-z17.s b/llvm/test/MC/SystemZ/directive-insn-z17.s
new file mode 100644
index 0000000000000..fcee4161e1055
--- /dev/null
+++ b/llvm/test/MC/SystemZ/directive-insn-z17.s
@@ -0,0 +1,23 @@
+# RUN: llvm-mc -triple s390x-linux-gnu -mcpu=z17 -filetype=obj %s | \
+# RUN: llvm-objdump --mcpu=z17 -d - | FileCheck %s
+
+# Test the .insn directive which provides a way of encoding an instruction
+# directly. It takes a format, encoding, and operands based on the format.
+# This file covers instruction formats newly supported.
+
+label.START:
+#CHECK: e3 12 34 56 78 60     lxab %r1, 492630(%r2,%r3)
+      .insn rxy_c,0xe30000000060,%r1,492630(%r2,%r3)
+
+#CHECK: e6 12 00 34 50 4a      vcvdq %v1, %v2, 69, 3
+      .insn vri_j,0xe6000000004a,%v1,%v2,69,3
+
+#CHECK: e7 12 30 45 60 88      veval %v1, %v2, %v3, %v6, 69
+      .insn vri_k,0xe70000000088,%v1,%v2,%v3,%v6,69
+
+#CHECK: e6 01 23 45 60 7f      vtz %v1, %v2, 13398
+      .insn vri_l,0xe6000000007f,%v1,%v2,13398
+
+#CHECK: e7 12 00 00 30 54      vgemg %v1, %v2
+      .insn vrr_a,0xe70000000054,%v1,%v2,3,0,0
+
diff --git a/llvm/test/MC/SystemZ/directive-insn.s b/llvm/test/MC/SystemZ/directive-insn.s
index f25082705c52e..5827e13497f61 100644
--- a/llvm/test/MC/SystemZ/directive-insn.s
+++ b/llvm/test/MC/SystemZ/directive-insn.s
@@ -32,6 +32,9 @@ label.ril:
 #CHECK: ec 1c f0 a0 34 fc     cgible %r1, 52, 160(%r15)
   .insn ris,0xec00000000fc,%r1,0x34,0xc,160(%r15)
 
+#CHECK: ec 1c f0 a0 ff fc     cgible %r1, -1, 160(%r15)
+  .insn ris,0xec00000000fc,%r1,255,0xc,160(%r15)
+
 # Test using an integer in place of a register.
 #CHECK: 18 23                 lr %r2, %r3
   .insn rr,0x1800,2,3
@@ -54,9 +57,9 @@ label.ril:
   .insn rs,0xba000000,%r0,%r1,160(%r15)
 
 # GAS considers this instruction's immediate operand to be PC relative.
-#CHECK: 84 13 00 04           brxh %r1, %r3, 0x4a
+#CHECK: 84 13 00 04           brxh %r1, %r3, 0x50
   .insn rsi,0x84000000,%r1,%r3,8
-#CHECK: 84 13 00 02           brxh %r1, %r3, 0x4a
+#CHECK: 84 13 00 02           brxh %r1, %r3, 0x50
   .insn rsi,0x84000000,%r1,%r3,label.rsi
 #CHECK: <label.rsi>:
 label.rsi:
@@ -86,12 +89,21 @@ label.rsi:
 #CHECK: 91 34 f0 a0           tm 160(%r15), 52
   .insn si,0x91000000,160(%r15),52
 
+#CHECK: 91 ff f0 a0           tm 160(%r15), 255
+  .insn si,0x91000000,160(%r15),-1
+
 #CHECK: eb f0 fc de ab 51     tmy -344866(%r15), 240
   .insn siy,0xeb0000000051,-344866(%r15),240
 
+#CHECK: eb ff fc de ab 51     tmy -344866(%r15), 255
+  .insn siy,0xeb0000000051,-344866(%r15),-1
+
 #CHECK: e5 60 f0 a0 12 34     tbegin 160(%r15), 4660
   .insn sil,0xe56000000000,160(%r15),0x1234
 
+#CHECK: e5 60 f0 a0 ff ff     tbegin 160(%r15), 65535
+  .insn sil,0xe56000000000,160(%r15),-1
+
 #CHECK: d9 13 f1 23 e4 56     mvck 291(%r1,%r15), 1110(%r14), %r3
   .insn ss,0xd90000000000,291(%r1,%r15),1110(%r14),%r3
 
@@ -100,3 +112,123 @@ label.rsi:
 
 #CHECK: c8 31 f0 a0 e2 34     ectg 160(%r15), 564(%r14), %r3
   .insn ssf,0xc80100000000,160(%r15),564(%r14),%r3
+
+#CHECK: 0a bc                 svc 188
+      .insn i,0x0a00,0xbc
+
+#CHECK: b2 fa 00 12           niai 1, 2
+      .insn ie,0xb2fa0000,0x1,0x2
+
+#CHECK: c5 f1 00 00 10 00 bprp 15, 0x2ae, 0x20ae
+      .insn mii,0xc50000000000,15,512,8192
+
+#CHECK: a7 1a af fe           ahi %r1, -20482
+      .insn ri,0xa70a0000,%r1,-20482
+
+#CHECK: a7 12 ff ff           tmhh %r1, 65535
+      .insn ri_a,0xa7020000,%r1,65535
+
+#CHECK: a7 15 ff fc           bras %r1, 0xb4
+      .insn ri_b,0xa7050000,%r1,-8
+
+#CHECK: a7 34 ff fc           jnle 0xb8
+      .insn ri_c,0xa7040000,3,-8
+
+#CHECK: ec 10 ff ff 70 72 cit %r1, -1, 7
+      .insn rie_a,0xec0000000072,%r1,65535,7
+
+#CHECK: ec 10 23 45 70 72    	cit %r1, 9029, 7
+      .insn rie_a,0xec0000000072,%r1,0x2345,7
+
+#CHECK: ec 12 00 00 70 77    	clrj %r1, %r2, 7, 0xd0
+      .insn rie_b,0xec0000000077,%r1,%r2,7,0
+
+#CHECK: ec 12 ff fc 34 7e    	cijh %r1, 52, 0xce
+      .insn rie_c,0xec000000007e,%r1,52,2,-8
+
+#CHECK: ec 12 ff fc ff 7e     cijh %r1, -1, 0xd4
+      .insn rie_c,0xec000000007e,%r1,255,2,-8
+
+#CHECK: ec 12 af fe 00 d8    	ahik %r1, %r2, -20482
+      .insn rie_d,0xec00000000d8,%r1,-20482,%r2
+
+#CHECK: ec 12 ff fc 00 44    	brxhg %r1, %r2, 0xe0
+      .insn rie_e,0xec0000000044,%r1,-8,%r2
+
+#CHECK: ec 12 fa ca de 5d    	risbhg	%r1, %r2, 250, 202, 222
+      .insn rie_f,0xec000000005d,%r1,%r2,250,202,222
+
+#CHECK: c2 15 00 fa ca de    	slfi	%r1, 16435934
+      .insn ril_a,0xc20500000000,%r1,16435934
+
+#CHECK: c2 15 ff ff ff ff slfi %r1, 4294967295
+      .insn ril_a,0xc20500000000,%r1,4294967295
+
+#CHECK: c0 15 ff ff ff fc    	brasl	%r1, 0xf8
+      .insn ril_b,0xc00500000000,%r1,-8
+
+#CHECK: c0 04 ff ff ff fc    	jgnop	0xfe
+      .insn ril_c,0xc00400000000,0,-8
+
+#CHECK: b3 3e 10 23  	madr	%f1, %f2, %f3
+      .insn rrd,0xb33e0000,%f1,%f3,%f2
+
+#CHECK: b3 d2 30 12  	adtr	%f1, %f2, %f3
+      .insn rrf,0xb3d20000,%f1,%f2,%f3,0
+
+#CHECK: b3 d2 31 12  	adtra	%f1, %f2, %f3, 1
+      .insn rrf_a,0xb3d20000,%f1,%f2,%f3,1
+
+#CHECK: b3 f6 20 13  	iedtr	%f1, %f2, %r3
+      .insn rrf_b,0xb3f60000,%f1,%r3,%f2,0
+
+#CHECK: b9 72 10 23  	crt	%r2, %r3, 1
+      .insn rrf_c,0xb9720000,%r2,%r3,1
+
+#CHECK: b3 e3 01 23  	csdtr	%r2, %f3, 1
+      .insn rrf_d,0xb3e30000,%r2,%f3,1
+
+#CHECK: b3 d7 12 34  	fidtr	%f3, 1, %f4, 2
+      .insn rrf_e,0xb3d70000,%r3,%f4,1,2
+
+#CHECK: 86 12 34 56  	bxh	%r1, %r2, 1110(%r3)
+      .insn rs_a,0x86000000,%r1,1110(%r3),%r2
+
+#CHECK: bd 12 34 56  	clm	%r1, 2, 1110(%r3)
+      .insn rs_b,0xbd000000,%r1,1110(%r3),2
+
+#CHECK: eb 10 23 45 00 c0    	tp	837(2,%r2)
+      .insn rsl_a,0xeb00000000c0,837(2,%r2)
+
+#CHECK: eb 12 34 56 78 44    	bxhg	%r1, %r2, 492630(%r3)
+      .insn rsy_a,0xeb0000000044,%r1,492630(%r3),%r2
+
+#CHECK: 5a 12 34 56  	a	%r1, 1110(%r2,%r3)
+      .insn rx_a,0x5a000000,%r1,1110(%r2,%r3)
+
+#CHECK: 47 12 34 56  	bo	1110(%r2,%r3)
+      .insn rx_b,0x47000000,1,1110(%r2,%r3)
+
+#CHECK: e3 12 34 56 78 16    	llgf	%r1, 492630(%r2,%r3)
+      .insn rxy_a,0xe30000000016,%r1,492630(%r2,%r3)
+
+#CHECK: e3 12 34 56 78 36     pfd 1, 492630(%r2,%r3)
+      .insn rxy_b,0xe30000000036,1,492630(%r2,%r3)
+
+#CHECK: d5 12 34 56 78 90     clc 1110(19,%r3), 2192(%r7)
+      .insn ss_a,0xd50000000000,1110(19,%r3),2192(%r7)
+
+#CHECK: f1 12 34 56 78 90      mvo 1110(2,%r3), 2192(3,%r7)
+      .insn ss_b,0xf10000000000,1110(2,%r3),2192(3,%r7)
+
+#CHECK: f0 12 34 56 78 90      srp 1110(2,%r3), 2192(%r7), 2
+      .insn ss_c,0xf00000000000,1110(2,%r3),2192(%r7),2
+
+#CHECK: da 12 34 56 78 90      mvcp 1110(%r1,%r3), 2192(%r7), %r2
+      .insn ss_d,0xda0000000000,1110(%r1,%r3),2192(%r7),%r2
+
+#CHECK: ef 12 34 56 78 90      lmd %r1, %r2, 1110(%r3), 2192(%r7)
+      .insn ss_e,0xef0000000000,%r1,1110(%r3),%r2,2192(%r7)
+
+#CHECK: e9 12 34 56 78 90      pka 1110(%r3), 2192(19,%r7)
+      .insn ss_f,0xe90000000000,1110(%r3),2192(19,%r7)

>From 269d3936971d5dd659eea3bc807ce795cb8ce658 Mon Sep 17 00:00:00 2001
From: Dominik Steenken <dost at de.ibm.com>
Date: Mon, 19 Jan 2026 10:05:11 +0100
Subject: [PATCH 2/4] [SystemZ] Simplify insn directive maintenance

This commit changes how the .insn directives for SystemZ are implemented
in significant ways:

- Implement a marker class InsnDirectiveBase which sets the necessary bits
  and can be used to easily identify Insn* defs in a TableGen backend.
- Autogenerate the match table in SystemZAsmParser.cpp via a new TableGen
  backend from the Insn* defs in SystemZInstrInfo.td.
- Remove the class layer between the Inst* format classes and the Insn* defs
  by moving the content of those classes into the Insn* def.
- Add tests covering all of the newly supported instruction formats for
  .insn directives.

After this commit, the process for supporting a new instruction format
changes from:
  1. Add format class
  2. Add DirectiveInsn class
  3. Add Insn def
  4. Update sorted match table
to:
  1. Add format class
  2. Add Insn def
---
 .../SystemZ/AsmParser/SystemZAsmParser.cpp    |  337 +----
 llvm/lib/Target/SystemZ/CMakeLists.txt        |    1 +
 .../lib/Target/SystemZ/SystemZInstrFormats.td |  661 +--------
 llvm/lib/Target/SystemZ/SystemZInstrInfo.td   | 1281 +++++++++++------
 llvm/test/MC/SystemZ/directive-insn-bad.s     |   97 ++
 llvm/test/MC/SystemZ/directive-insn-z13.s     |    5 +
 llvm/test/MC/SystemZ/directive-insn.s         |    7 +
 llvm/utils/TableGen/CMakeLists.txt            |    1 +
 .../TableGen/SystemZInsnDirectiveEmitter.cpp  |  135 ++
 9 files changed, 1130 insertions(+), 1395 deletions(-)
 create mode 100644 llvm/test/MC/SystemZ/directive-insn-bad.s
 create mode 100644 llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp

diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
index 9484030c87aa1..f0d842ac93dc8 100644
--- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
+++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
@@ -660,339 +660,16 @@ struct CompareInsn {
     return LHS < RHS.Format;
   }
   bool operator() (const InsnMatchEntry &LHS, const InsnMatchEntry &RHS) {
-    return LHS.Format < RHS.Format;
+    if (LHS.Format != RHS.Format)
+      return LHS.Format < RHS.Format;
+    return LHS.Opcode < RHS.Opcode;
   }
 };
 
 // Table initializing information for parsing the .insn directive.
 static struct InsnMatchEntry InsnMatchTable[] = {
-    /* Format, Opcode, NumOperands, OperandKinds */
-    {"e", SystemZ::InsnE, 1, {MCK_U16Imm}},
-    {"i", SystemZ::InsnI, 2, {MCK_U16Imm, MCK_U8Imm}},
-    {"ie", SystemZ::InsnIE, 3, {MCK_U32Imm, MCK_U4Imm, MCK_U4Imm}},
-    {"mii",
-     SystemZ::InsnMII,
-     4,
-     {MCK_U48Imm, MCK_U4Imm, MCK_PCRel12, MCK_PCRel24}},
-    {"ri", SystemZ::InsnRIa, 3, {MCK_U32Imm, MCK_AnyReg, MCK_S16Imm}},
-    {"ri_a", SystemZ::InsnRIa, 3, {MCK_U32Imm, MCK_AnyReg, MCK_X16Imm}},
-    {"ri_b", SystemZ::InsnRIb, 3, {MCK_U32Imm, MCK_AnyReg, MCK_PCRel16}},
-    {"ri_c", SystemZ::InsnRIc, 3, {MCK_U32Imm, MCK_U4Imm, MCK_PCRel16}},
-    {"rie",
-     SystemZ::InsnRIE,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_PCRel16}},
-    {"rie_a",
-     SystemZ::InsnRIEa,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_X16Imm, MCK_U4Imm}},
-    {"rie_b",
-     SystemZ::InsnRIEb,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_PCRel16}},
-    {"rie_c",
-     SystemZ::InsnRIEc,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_X8Imm, MCK_U4Imm, MCK_PCRel16}},
-    {"rie_d",
-     SystemZ::InsnRIEd,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_S16Imm, MCK_AnyReg}},
-    {"rie_e",
-     SystemZ::InsnRIEe,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_PCRel16, MCK_AnyReg}},
-    {"rie_f",
-     SystemZ::InsnRIEf,
-     6,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U8Imm, MCK_U8Imm, MCK_U8Imm}},
-    {"rie_g",
-     SystemZ::InsnRIEg,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_S16Imm, MCK_U4Imm}},
-    {"ril", SystemZ::InsnRIL, 3, {MCK_U48Imm, MCK_AnyReg, MCK_PCRel32}},
-    {"ril_a", SystemZ::InsnRILa, 3, {MCK_U48Imm, MCK_AnyReg, MCK_X32Imm}},
-    {"ril_b", SystemZ::InsnRILb, 3, {MCK_U48Imm, MCK_AnyReg, MCK_PCRel32}},
-    {"ril_c", SystemZ::InsnRILc, 3, {MCK_U48Imm, MCK_U4Imm, MCK_PCRel32}},
-    {"rilu", SystemZ::InsnRILU, 3, {MCK_U48Imm, MCK_AnyReg, MCK_U32Imm}},
-    {"ris",
-     SystemZ::InsnRIS,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_X8Imm, MCK_U4Imm, MCK_BDAddr64Disp12}},
-    {"rr", SystemZ::InsnRR, 3, {MCK_U16Imm, MCK_AnyReg, MCK_AnyReg}},
-    {"rrd",
-     SystemZ::InsnRRD,
-     4,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg}},
-    {"rre", SystemZ::InsnRRE, 3, {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg}},
-
-    {"rrf",
-     SystemZ::InsnRRF,
-     5,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
-    {"rrf_a",
-     SystemZ::InsnRRFa,
-     5,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
-    {"rrf_b",
-     SystemZ::InsnRRFb,
-     5,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
-    {"rrf_c",
-     SystemZ::InsnRRFc,
-     4,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
-    {"rrf_d",
-     SystemZ::InsnRRFd,
-     4,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm}},
-    {"rrf_e",
-     SystemZ::InsnRRFe,
-     5,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_U4Imm}},
-    {"rrs",
-     SystemZ::InsnRRS,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_U4Imm, MCK_BDAddr64Disp12}},
-    {"rs",
-     SystemZ::InsnRS,
-     4,
-     {MCK_U32Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12}},
-    {"rs_a",
-     SystemZ::InsnRSa,
-     4,
-     {MCK_U32Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_AnyReg}},
-    {"rs_b",
-     SystemZ::InsnRSb,
-     4,
-     {MCK_U32Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_U4Imm}},
-    {"rse",
-     SystemZ::InsnRSE,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp12}},
-    {"rsi",
-     SystemZ::InsnRSI,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_PCRel16}},
-    {"rsl_a", SystemZ::InsnRSLa, 2, {MCK_U48Imm, MCK_BDLAddr64Disp12Len4}},
-    {"rsl_b",
-     SystemZ::InsnRSLb,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDLAddr64Disp12Len8, MCK_U4Imm}},
-    {"rsy",
-     SystemZ::InsnRSY,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDAddr64Disp20}},
-    {"rsy_a",
-     SystemZ::InsnRSYa,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp20, MCK_AnyReg}},
-    {"rsy_b",
-     SystemZ::InsnRSYb,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp20, MCK_U4Imm}},
-    {"rx", SystemZ::InsnRX, 3, {MCK_U32Imm, MCK_AnyReg, MCK_BDXAddr64Disp12}},
-    {"rx_a",
-     SystemZ::InsnRXa,
-     3,
-     {MCK_U32Imm, MCK_AnyReg, MCK_BDXAddr64Disp12}},
-    {"rx_b", SystemZ::InsnRXb, 3, {MCK_U32Imm, MCK_U4Imm, MCK_BDXAddr64Disp12}},
-    {"rxe", SystemZ::InsnRXE, 3, {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp12}},
-    {"rxf",
-     SystemZ::InsnRXF,
-     4,
-     {MCK_U48Imm, MCK_AnyReg, MCK_AnyReg, MCK_BDXAddr64Disp12}},
-    {"rxy", SystemZ::InsnRXY, 3, {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20}},
-    {"rxy_a",
-     SystemZ::InsnRXYa,
-     3,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20}},
-    {"rxy_b",
-     SystemZ::InsnRXYb,
-     3,
-     {MCK_U48Imm, MCK_U4Imm, MCK_BDXAddr64Disp20}},
-    {"rxy_c",
-     SystemZ::InsnRXYc,
-     3,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDXAddr64Disp20}},
-    {"s", SystemZ::InsnS, 2, {MCK_U32Imm, MCK_BDAddr64Disp12}},
-    {"si", SystemZ::InsnSI, 3, {MCK_U32Imm, MCK_BDAddr64Disp12, MCK_X8Imm}},
-    {"sil", SystemZ::InsnSIL, 3, {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_X16Imm}},
-    {"siy", SystemZ::InsnSIY, 3, {MCK_U48Imm, MCK_BDAddr64Disp20, MCK_X8Imm}},
-    {"smi",
-     SystemZ::InsnSMI,
-     4,
-     {MCK_U48Imm, MCK_U4Imm, MCK_PCRel16, MCK_BDAddr64Disp12}},
-    {"ss",
-     SystemZ::InsnSS,
-     4,
-     {MCK_U48Imm, MCK_BDXAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg}},
-    {"ss_a",
-     SystemZ::InsnSSa,
-     3,
-     {MCK_U48Imm, MCK_BDLAddr64Disp12Len8, MCK_BDAddr64Disp12}},
-    {"ss_b",
-     SystemZ::InsnSSb,
-     3,
-     {MCK_U48Imm, MCK_BDLAddr64Disp12Len4, MCK_BDLAddr64Disp12Len4}},
-    {"ss_c",
-     SystemZ::InsnSSc,
-     4,
-     {MCK_U48Imm, MCK_BDLAddr64Disp12Len4, MCK_BDAddr64Disp12, MCK_U4Imm}},
-    {"ss_d",
-     SystemZ::InsnSSd,
-     4,
-     {MCK_U48Imm, MCK_BDXAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg}},
-    {"ss_e",
-     SystemZ::InsnSSe,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_AnyReg,
-      MCK_BDAddr64Disp12}},
-    {"ss_f",
-     SystemZ::InsnSSf,
-     3,
-     {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDLAddr64Disp12Len8}},
-    {"sse",
-     SystemZ::InsnSSE,
-     3,
-     {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12}},
-    {"ssf",
-     SystemZ::InsnSSF,
-     4,
-     {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg}},
-    {"vri",
-     SystemZ::InsnVRIe,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U12Imm, MCK_U4Imm, MCK_U4Imm}},
-    {"vri_a",
-     SystemZ::InsnVRIa,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_X16Imm, MCK_U4Imm}},
-    {"vri_b",
-     SystemZ::InsnVRIb,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_U8Imm, MCK_U8Imm, MCK_U4Imm}},
-    {"vri_c",
-     SystemZ::InsnVRIc,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_U16Imm, MCK_VR128, MCK_U4Imm}},
-    {"vri_d",
-     SystemZ::InsnVRId,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U4Imm}},
-    {"vri_e",
-     SystemZ::InsnVRIe,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U16Imm, MCK_U4Imm, MCK_U4Imm}},
-    {"vri_f",
-     SystemZ::InsnVRIf,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U4Imm}},
-    {"vri_g",
-     SystemZ::InsnVRIg,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U8Imm, MCK_U4Imm}},
-    {"vri_h",
-     SystemZ::InsnVRIh,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_U16Imm, MCK_U4Imm, MCK_U4Imm}},
-    {"vri_i",
-     SystemZ::InsnVRIi,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_AnyReg, MCK_U8Imm, MCK_U4Imm}},
-    {"vri_j",
-     SystemZ::InsnVRIj,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U8Imm, MCK_U4Imm}},
-    {"vri_k",
-     SystemZ::InsnVRIk,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U8Imm}},
-    {"vri_l",
-     SystemZ::InsnVRIl,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U16Imm}},
-    {"vrr",
-     SystemZ::InsnVRR,
-     7,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm,
-      MCK_U4Imm}},
-    {"vrr_a",
-     SystemZ::InsnVRRa,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm, MCK_U4Imm}},
-    {"vrr_b",
-     SystemZ::InsnVRRb,
-     6,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm}},
-    {"vrr_c",
-     SystemZ::InsnVRRc,
-     7,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm, MCK_U4Imm,
-      MCK_U4Imm}},
-    {"vrr_d",
-     SystemZ::InsnVRRd,
-     7,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm,
-      MCK_U4Imm}},
-    {"vrr_e",
-     SystemZ::InsnVRRe,
-     7,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm,
-      MCK_U4Imm}},
-    {"vrr_f",
-     SystemZ::InsnVRRf,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_AnyReg, MCK_AnyReg}},
-    {"vrr_g", SystemZ::InsnVRRg, 3, {MCK_U48Imm, MCK_VR128, MCK_U16Imm}},
-    {"vrr_h",
-     SystemZ::InsnVRRh,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U4Imm}},
-    {"vrr_i",
-     SystemZ::InsnVRRi,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_U4Imm, MCK_U4Imm}},
-    {"vrr_j",
-     SystemZ::InsnVRRj,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_VR128, MCK_U4Imm}},
-    {"vrr_k",
-     SystemZ::InsnVRRk,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_VR128, MCK_U4Imm}},
-    {"vrs",
-     SystemZ::InsnVRS,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_VR128, MCK_BDAddr64Disp12, MCK_U4Imm}},
-    {"vrs_a",
-     SystemZ::InsnVRSa,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_VR128, MCK_U4Imm}},
-    {"vrs_b",
-     SystemZ::InsnVRSb,
-     5,
-     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_AnyReg, MCK_U4Imm}},
-    {"vrs_c",
-     SystemZ::InsnVRSc,
-     5,
-     {MCK_U48Imm, MCK_AnyReg, MCK_BDAddr64Disp12, MCK_VR128, MCK_U4Imm}},
-    {"vrs_d",
-     SystemZ::InsnVRSd,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_AnyReg}},
-    {"vrv",
-     SystemZ::InsnVRV,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_BDVAddr64Disp12, MCK_U4Imm}},
-    {"vrx",
-     SystemZ::InsnVRX,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_BDXAddr64Disp12, MCK_U4Imm}},
-    {"vsi",
-     SystemZ::InsnVSI,
-     4,
-     {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_U8Imm}}};
+#include "SystemZGenInsnMatchTable.inc"
+};
 
 void SystemZOperand::print(raw_ostream &OS, const MCAsmInfo &MAI) const {
   switch (Kind) {
@@ -1566,6 +1243,8 @@ bool SystemZAsmParser::parseDirectiveInsn(SMLoc L) {
       ResTy = parseVR128(Operands);
     else if (Kind == MCK_BDXAddr64Disp12 || Kind == MCK_BDXAddr64Disp20)
       ResTy = parseBDXAddr64(Operands);
+    else if (Kind == MCK_BDRAddr64Disp12)
+      ResTy = parseBDRAddr64(Operands);
     else if (Kind == MCK_BDAddr64Disp12 || Kind == MCK_BDAddr64Disp20)
       ResTy = parseBDAddr64(Operands);
     else if (Kind == MCK_BDVAddr64Disp12)
@@ -1621,6 +1300,8 @@ bool SystemZAsmParser::parseDirectiveInsn(SMLoc L) {
       ZOperand.addBDAddrOperands(Inst, 2);
     else if (ZOperand.isMem(BDXMem))
       ZOperand.addBDXAddrOperands(Inst, 3);
+    else if (ZOperand.isMem(BDRMem))
+      ZOperand.addBDRAddrOperands(Inst, 3);
     else if (ZOperand.isMem(BDVMem))
       ZOperand.addBDVAddrOperands(Inst, 3);
     else if (ZOperand.isMem(BDLMem))
diff --git a/llvm/lib/Target/SystemZ/CMakeLists.txt b/llvm/lib/Target/SystemZ/CMakeLists.txt
index 51021b30fd073..c990acff16d58 100644
--- a/llvm/lib/Target/SystemZ/CMakeLists.txt
+++ b/llvm/lib/Target/SystemZ/CMakeLists.txt
@@ -8,6 +8,7 @@ tablegen(LLVM SystemZGenHLASMAsmWriter.inc -gen-asm-writer -asmwriternum=1)
 tablegen(LLVM SystemZGenCallingConv.inc -gen-callingconv)
 tablegen(LLVM SystemZGenDAGISel.inc -gen-dag-isel)
 tablegen(LLVM SystemZGenDisassemblerTables.inc -gen-disassembler)
+tablegen(LLVM SystemZGenInsnMatchTable.inc -gen-insn-directive-match-table)
 tablegen(LLVM SystemZGenInstrInfo.inc -gen-instr-info)
 tablegen(LLVM SystemZGenMCCodeEmitter.inc -gen-emitter)
 tablegen(LLVM SystemZGenRegisterInfo.inc -gen-register-info)
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrFormats.td b/llvm/lib/Target/SystemZ/SystemZInstrFormats.td
index 00452377bbf5f..10d09ecd637f8 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrFormats.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrFormats.td
@@ -1758,662 +1758,17 @@ class InstVSI<bits<16> op, dag outs, dag ins, string asmstr, list<dag> pattern>
 }
 
 //===----------------------------------------------------------------------===//
-// Instruction classes for .insn directives
+// Base class for all .insn directive instructions
 //===----------------------------------------------------------------------===//
-
-class DirectiveInsnE<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstE<0, outs, ins, asmstr, pattern> {
-  bits<16> enc;
-
-  let Inst = enc;
-}
-
-class DirectiveInsnI<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstI<0, outs, ins, asmstr, pattern> {
-  bits<16> enc;
-
-  let Inst{15 -8} = enc{15 -8};
-}
-
-class DirectiveInsnIE<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstIE<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -16} = enc{31 -16};
-}
-
-class DirectiveInsnMII<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstMII<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnRIa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIa<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-24} = enc{31-24};
-  let Inst{19-16} = enc{19-16};
-}
-
-class DirectiveInsnRIb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIb<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -24} = enc{31 -24};
-  let Inst{19 -16} = enc{19 -16};
-}
-
-class DirectiveInsnRIc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIc<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -24} = enc{31 -24};
-  let Inst{19 -16} = enc{19 -16};
-}
-
-class DirectiveInsnRIEa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRIEb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRIEc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEc<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRIEd<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEd<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRIEe<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEe<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRIEf<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEf<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRIEg<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRIEg<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRILa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRILa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-  // string type;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{35 -32} = enc{35 -32};
-}
-
-class DirectiveInsnRILb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRILb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-  // string type;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{35 -32} = enc{35 -32};
-}
-
-class DirectiveInsnRILc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRILc<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-  // string type;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{35-32} = enc{35-32};
-}
-
-class DirectiveInsnRIS<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRIS<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRR<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRR<0, outs, ins, asmstr, pattern> {
-  bits<16> enc;
-
-  let Inst{15-8} = enc{15-8};
-}
-
-class DirectiveInsnRRD<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRRD<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -16} = enc{31 -16};
-}
-
-class DirectiveInsnRRE<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRRE<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-16} = enc{31-16};
-}
-
-class DirectiveInsnRRFa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRRFa<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-16} = enc{31-16};
-}
-
-// RRF-b is identical to RRF-a, and is thus omitted
-
-class DirectiveInsnRRFc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRRFc<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -16} = enc{31 -16};
-}
-
-class DirectiveInsnRRFd<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRRFd<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -16} = enc{31 -16};
-}
-
-class DirectiveInsnRRFe<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRRFe<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -16} = enc{31 -16};
-}
-
-class DirectiveInsnRRS<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRRS<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRSa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRSa<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-24} = enc{31-24};
-}
-
-class DirectiveInsnRSb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRSb<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -24} = enc{31 -24};
-}
-
-class DirectiveInsnRSE<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRSEa<6, outs, ins, asmstr, pattern> {
-  bits <48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRSI<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRSI<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-24} = enc{31-24};
-}
-
-class DirectiveInsnRSLa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRSLa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRSLb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRSLb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRSYa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRSYa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRSYb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRSYb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRXa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRXa<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-24} = enc{31-24};
-}
-
-class DirectiveInsnRXb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRXb<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31 -24} = enc{31 -24};
-}
-
-class DirectiveInsnRXE<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRXE<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let M3 = 0;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRXF<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstRXF<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnRXYa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRXYa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRXYb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRXYb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnRXYc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstRXYa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnS<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstS<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-16} = enc{31-16};
+// This marker class is used to identify .insn directive instructions
+// for the SystemZInsnDirectiveEmitter. It must be the rightmost parent
+// in the inheritance list to ensure these properties take precedence over
+// the ones set by the InstFoo base classes.
+class InsnDirectiveBase {
+  bit isCodeGenOnly = 1;
+  bit hasSideEffects = 1;
 }
 
-class DirectiveInsnSI<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstSI<0, outs, ins, asmstr, pattern> {
-  bits<32> enc;
-
-  let Inst{31-24} = enc{31-24};
-}
-
-class DirectiveInsnSIY<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstSIY<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnSIL<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstSIL<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-32} = enc{47-32};
-}
-
-class DirectiveInsnSMI<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSMI<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnSSa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSSa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnSSb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSSb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnSSc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSSc<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnSSd<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSSd<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-}
-
-class DirectiveInsnSSe<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSSe<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnSSf<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstSSf<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-}
-
-class DirectiveInsnSSE<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstSSE<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-32} = enc{47-32};
-}
-
-class DirectiveInsnSSF<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstSSF<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{35-32} = enc{35-32};
-}
-
-class DirectiveInsnVRIa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIc<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRId<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRId<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIe<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIe<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnVRIf<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIf<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIg<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIg<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIh<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIh<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIi<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIi<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIj<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIj<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIk<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIk<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRIl<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRIl<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRc<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnVRRd<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRd<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRe<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRe<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRf<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRf<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRg<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRg<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRh<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRh<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRi<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRi<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRj<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRj<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRRk<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRRk<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRSa<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRSa<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRSb<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRSb<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRSc<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRSc<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnVRSd<dag outs, dag ins, string asmstr, list<dag> pattern>
-    : InstVRSd<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47 -40} = enc{47 -40};
-  let Inst{7 -0} = enc{7 -0};
-}
-
-class DirectiveInsnVRV<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstVRV<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnVRX<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstVRX<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-class DirectiveInsnVSI<dag outs, dag ins, string asmstr, list<dag> pattern>
-  : InstVSI<0, outs, ins, asmstr, pattern> {
-  bits<48> enc;
-
-  let Inst{47-40} = enc{47-40};
-  let Inst{7-0}   = enc{7-0};
-}
-
-
 //===----------------------------------------------------------------------===//
 // Variants of instructions with condition mask
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
index 73708d3a4e0b3..459d574b6cfdd 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
@@ -2275,420 +2275,873 @@ let hasSideEffects = 1 in {
 // .insn directive instructions
 //===----------------------------------------------------------------------===//
 
-let isCodeGenOnly = 1, hasSideEffects = 1 in {
-  def InsnE   : DirectiveInsnE<(outs), (ins imm64zx16:$enc), ".insn e,$enc", []>;
-  def InsnI : DirectiveInsnI<(outs), (ins imm64zx16:$enc, imm32zx8:$I1),
-                             ".insn i,$enc,$I1", []>;
-  def InsnIE : DirectiveInsnIE<(outs),
-                               (ins imm64zx32:$enc, imm32zx4:$I1, imm32zx4:$I2),
-                               ".insn ie,$enc,$I1,$I2", []>;
-  def InsnMII : DirectiveInsnMII<(outs),
-                                 (ins imm64zx48:$enc, imm32zx4:$M1,
-                                     brtarget12bpp:$RI2, brtarget24bpp:$RI3),
-                                 ".insn mii,$enc,$M1,$RI2,$RI3", []>;
-  def InsnRI : DirectiveInsnRIa<(outs),
-                                (ins imm64zx32:$enc, AnyReg:$R1, imm32sx16:$I2),
-                                ".insn ri,$enc,$R1,$I2", []>;
-  def InsnRIa
-      : DirectiveInsnRIa<(outs),
-                         (ins imm64zx32:$enc, AnyReg:$R1, imm32xx16:$I2),
-                         ".insn ri_a,$enc,$R1,$I2", []>;
-  def InsnRIb
-      : DirectiveInsnRIb<(outs),
-                         (ins imm64zx32:$enc, AnyReg:$R1, brtarget16:$RI2),
-                         ".insn ri_b,$enc,$R1,$RI2", []>;
-  def InsnRIc
-      : DirectiveInsnRIc<(outs),
-                         (ins imm64zx32:$enc, imm32zx4:$M1, brtarget16:$RI2),
-                         ".insn ri_c,$enc,$M1,$RI2", []>;
-  def InsnRIE : DirectiveInsnRIEd<(outs),
-                                  (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
-                                      brtarget16:$I2),
-                                  ".insn rie,$enc,$R1,$R3,$I2", []>;
-  def InsnRIEa : DirectiveInsnRIEa<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       imm32xx16:$I2, imm32zx4:$M3),
-                                   ".insn rie_a,$enc,$R1,$I2,$M3", []>;
-  def InsnRIEb : DirectiveInsnRIEb<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2,
-                                       imm32zx4:$M3, brtarget16:$RI4),
-                                   ".insn rie_b,$enc,$R1,$R2,$M3,$RI4", []>;
-  def InsnRIEc
-      : DirectiveInsnRIEc<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1, imm32xx8:$I2,
-                              imm32zx4:$M3, brtarget16:$RI4),
-                          ".insn rie_c,$enc,$R1,$I2,$M3,$RI4", []>;
-  def InsnRIEd
-      : DirectiveInsnRIEd<
-            (outs), (ins imm64zx48:$enc, AnyReg:$R1, imm32sx16:$I2, AnyReg:$R3),
-            ".insn rie_d,$enc,$R1,$I2,$R3", []>;
-  def InsnRIEe : DirectiveInsnRIEe<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       brtarget16:$RI2, AnyReg:$R3),
-                                   ".insn rie_e,$enc,$R1,$RI2,$R3", []>;
-  def InsnRIEf
-      : DirectiveInsnRIEf<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2,
-                              imm32zx8:$I3, imm32zx8:$I4, imm32zx8:$I5),
-                          ".insn rie_f,$enc,$R1,$R2,$I3,$I4,$I5", []>;
-  def InsnRIEg : DirectiveInsnRIEg<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       imm32sx16:$I2, imm32zx4:$M3),
-                                   ".insn rie_g,$enc,$R1,$I2,$M3", []>;
-  def InsnRIL
-      : DirectiveInsnRILa<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1, brtarget32:$I2),
-                          ".insn ril,$enc,$R1,$I2", []>;
-  def InsnRILa
-      : DirectiveInsnRILa<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1, imm64xx32:$I2),
-                          ".insn ril_a,$enc,$R1,$I2", []>;
-  def InsnRILb
-      : DirectiveInsnRILb<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1, brtarget32:$RI2),
-                          ".insn ril_b,$enc,$R1,$RI2", []>;
-  def InsnRILc
-      : DirectiveInsnRILc<(outs),
-                          (ins imm64zx48:$enc, imm32zx4:$M1, brtarget32:$RI2),
-                          ".insn ril_c,$enc,$M1,$RI2", []>;
-  def InsnRILU
-      : DirectiveInsnRILa<(outs), (ins imm64zx48:$enc, AnyReg:$R1, uimm32:$I2),
-                          ".insn rilu,$enc,$R1,$I2", []>;
-  def InsnRIS
-      : DirectiveInsnRIS<(outs),
-                         (ins imm64zx48:$enc, AnyReg:$R1, imm32xx8:$I2,
-                             imm32zx4:$M3, (bdaddr12only $B4, $D4):$BD4),
-                         ".insn ris,$enc,$R1,$I2,$M3,$BD4", []>;
-  def InsnRR : DirectiveInsnRR<(outs),
-                               (ins imm64zx16:$enc, AnyReg:$R1, AnyReg:$R2),
-                               ".insn rr,$enc,$R1,$R2", []>;
-  def InsnRRD
-      : DirectiveInsnRRD<
-            (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3),
-            ".insn rrd,$enc,$R1,$R2,%R3", []>;
-  def InsnRRE : DirectiveInsnRRE<(outs), (ins imm64zx32:$enc,
-                                              AnyReg:$R1, AnyReg:$R2),
-                                 ".insn rre,$enc,$R1,$R2", []>;
-  def InsnRRF : DirectiveInsnRRFa<(outs),
-                                  (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
-                                      AnyReg:$R3, imm32zx4:$M4),
-                                  ".insn rrf,$enc,$R1,$R2,$R3,$M4", []>;
-  def InsnRRFa : DirectiveInsnRRFa<(outs),
-                                   (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
-                                       AnyReg:$R3, imm32zx4:$M4),
-                                   ".insn rrf_a,$enc,$R1,$R2,$R3,$M4", []>;
-  def InsnRRFb : DirectiveInsnRRFa<(outs),
-                                   (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
-                                       AnyReg:$R3, imm32zx4:$M4),
-                                   ".insn rrf_b,$enc,$R1,$R2,$R3,$M4", []>;
-  def InsnRRFc
-      : DirectiveInsnRRFc<
-            (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M3),
-            ".insn rrf_c,$enc,$R1,$R2,$M3", []>;
-  def InsnRRFd
-      : DirectiveInsnRRFd<
-            (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M4),
-            ".insn rrf_d,$enc,$R1,$R2,$M4", []>;
-  def InsnRRFe : DirectiveInsnRRFe<(outs),
-                                   (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
-                                       imm32zx4:$M3, imm32zx4:$M4),
-                                   ".insn rrf_e,$enc,$R1,$R2,$M3,$M4", []>;
-  def InsnRRS : DirectiveInsnRRS<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                      AnyReg:$R2, imm32zx4:$M3,
-                                      (bdaddr12only $B4, $D4):$BD4),
-                                 ".insn rrs,$enc,$R1,$R2,$M3,$BD4", []>;
-  def InsnRS : DirectiveInsnRSa<(outs),
-                                (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R3,
-                                    (bdaddr12only $B2, $D2):$BD2),
-                                ".insn rs,$enc,$R1,$R3,$BD2", []>;
-  def InsnRSa : DirectiveInsnRSa<(outs),
-                                 (ins imm64zx32:$enc, AnyReg:$R1,
-                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
-                                 ".insn rs_a,$enc,$R1,$BD2,$R3", []>;
-  def InsnRSb
-      : DirectiveInsnRSb<(outs),
-                         (ins imm64zx32:$enc, AnyReg:$R1,
-                             (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M3),
-                         ".insn rs_b,$enc,$R1,$BD2,$M3", []>;
-  def InsnRSE : DirectiveInsnRSE<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                      AnyReg:$R3, (bdaddr12only $B2, $D2):$BD2),
-                                 ".insn rse,$enc,$R1,$R3,$BD2", []>;
-  def InsnRSI : DirectiveInsnRSI<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                      AnyReg:$R3, brtarget16:$RI2),
-                                 ".insn rsi,$enc,$R1,$R3,$RI2", []>;
-  def InsnRSLa : DirectiveInsnRSLa<(outs),
-                                   (ins imm64zx48:$enc, (bdladdr12onlylen4 $B1,
-                                                            $D1, $L1):$BDL1),
-                                   ".insn rsl_a,$enc,$BDL1", []>;
-  def InsnRSLb : DirectiveInsnRSLb<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       (bdladdr12onlylen8 $B2, $D2, $L2):$BDL2,
-                                       imm32zx4:$M3),
-                                   ".insn rsl_b,$enc,$R1,$BDL2,$M3", []>;
-  def InsnRSY : DirectiveInsnRSYa<(outs),
-                                  (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
-                                      (bdaddr20only $B2, $D2):$BD2),
-                                  ".insn rsy,$enc,$R1,$R3,$BD2", []>;
-  def InsnRSYa
-      : DirectiveInsnRSYa<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1,
-                              (bdaddr20only $B2, $D2):$BD2, AnyReg:$R3),
-                          ".insn rsy_a,$enc,$R1,$BD2,$R3", []>;
-  def InsnRSYb
-      : DirectiveInsnRSYb<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1,
-                              (bdaddr20only $B2, $D2):$BD2, imm32zx4:$M3),
-                          ".insn rsy_b,$enc,$R1,$BD2,$M3", []>;
-  def InsnRX : DirectiveInsnRXa<(outs),
-                                (ins imm64zx32:$enc, AnyReg:$R1,
-                                    (bdxaddr12only $B2, $D2, $X2):$XBD2),
-                                ".insn rx,$enc,$R1,$XBD2", []>;
-  def InsnRXa : DirectiveInsnRXa<(outs),
-                                 (ins imm64zx32:$enc, AnyReg:$R1,
-                                     (bdxaddr12only $B2, $D2, $X2):$XBD2),
-                                 ".insn rx_a,$enc,$R1,$XBD2", []>;
-  def InsnRXb : DirectiveInsnRXb<(outs),
-                                 (ins imm64zx32:$enc, imm32zx4:$M1,
-                                     (bdxaddr12only $B2, $D2, $X2):$XBD2),
-                                 ".insn rx_b,$enc,$M1,$XBD2", []>;
-  def InsnRXE : DirectiveInsnRXE<(outs), (ins imm64zx48:$enc, AnyReg:$R1,
-                                              (bdxaddr12only $B2, $D2, $X2):$XBD2),
-                                 ".insn rxe,$enc,$R1,$XBD2", []>;
-  def InsnRXF : DirectiveInsnRXF<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                      AnyReg:$R3, (bdxaddr12only $B2, $D2, $X2):$XBD2),
-                                 ".insn rxf,$enc,$R1,$R3,$XBD2", []>;
-  def InsnRXY : DirectiveInsnRXYa<(outs),
-                                  (ins imm64zx48:$enc, AnyReg:$R1,
-                                      (bdxaddr20only $B2, $D2, $X2):$XBD2),
-                                  ".insn rxy,$enc,$R1,$XBD2", []>;
-  def InsnRXYa : DirectiveInsnRXYa<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       (bdxaddr20only $B2, $D2, $X2):$XBD2),
-                                   ".insn rxy_a,$enc,$R1,$XBD2", []>;
-  def InsnRXYb : DirectiveInsnRXYb<(outs),
-                                   (ins imm64zx48:$enc, imm32zx4:$M1,
-                                       (bdxaddr20only $B2, $D2, $X2):$XBD2),
-                                   ".insn rxy_b,$enc,$M1,$XBD2", []>;
-  def InsnRXYc : DirectiveInsnRXYa<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       (bdxaddr20only $B2, $D2, $X2):$XBD2),
-                                   ".insn rxy_c,$enc,$R1,$XBD2", []>;
-  def InsnS : DirectiveInsnS<(outs),
-                             (ins imm64zx32:$enc, (bdaddr12only $B2, $D2):$BD2),
-                             ".insn s,$enc,$BD2", []>;
-  def InsnSI : DirectiveInsnSI<(outs),
-                               (ins imm64zx32:$enc,
-                                   (bdaddr12only $B1, $D1):$BD1, imm32xx8:$I2),
-                               ".insn si,$enc,$BD1,$I2", []>;
-  def InsnSIY
-      : DirectiveInsnSIY<(outs),
-                         (ins imm64zx48:$enc, (bdaddr20only $B1, $D1):$BD1,
-                             imm32xx8:$I2),
-                         ".insn siy,$enc,$BD1,$I2", []>;
-  def InsnSIL
-      : DirectiveInsnSIL<(outs),
-                         (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
-                             imm32xx16:$I2),
-                         ".insn sil,$enc,$BD1,$I2", []>;
-  def InsnSMI
-      : DirectiveInsnSMI<(outs),
-                         (ins imm64zx48:$enc, imm32zx4:$M1, brtarget16bpp:$RI2,
-                             (bdaddr12only $B3, $D3):$BD3),
-                         ".insn smi,$enc,$M1,$RI2,$BD3", []>;
-  def InsnSS : DirectiveInsnSSd<(outs),
-                                (ins imm64zx48:$enc,
-                                    (bdraddr12only $B1, $D1, $R1):$RBD1,
-                                    (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
-                                ".insn ss,$enc,$RBD1,$BD2,$R3", []>;
-  def InsnSSa : DirectiveInsnSSa<(outs),
-                                 (ins imm64zx48:$enc,
-                                     (bdladdr12onlylen8 $B1, $D1, $L1):$BDL1,
-                                     (bdaddr12only $B2, $D2):$BD2),
-                                 ".insn ss_a,$enc,$BDL1,$BD2", []>;
-  def InsnSSb : DirectiveInsnSSb<(outs),
-                                 (ins imm64zx48:$enc,
-                                     (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1,
-                                     (bdladdr12onlylen4 $B2, $D2, $L2):$BDL2),
-                                 ".insn ss_b,$enc,$BDL1,$BDL2", []>;
-  def InsnSSc
-      : DirectiveInsnSSc<(outs),
-                         (ins imm64zx48:$enc,
-                             (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1,
-                             (bdaddr12only $B2, $D2):$BD2, imm32zx4:$I3),
-                         ".insn ss_c,$enc,$BDL1,$BD2,$I3", []>;
-  def InsnSSd : DirectiveInsnSSd<(outs),
-                                 (ins imm64zx48:$enc,
-                                     (bdraddr12only $B1, $D1, $R1):$RBD1,
-                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
-                                 ".insn ss_d,$enc,$RBD1,$BD2,$R3", []>;
-  def InsnSSe : DirectiveInsnSSe<(outs),
-                                 (ins imm64zx48:$enc, AnyReg:$R1,
-                                     (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3,
-                                     (bdaddr12only $B4, $D4):$BD4),
-                                 ".insn ss_e,$enc,$R1,$BD2,$R3,$BD4", []>;
-  def InsnSSf
-      : DirectiveInsnSSf<(outs),
-                         (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
-                             (bdladdr12onlylen8 $B2, $D2, $L2):$BDL2),
-                         ".insn ss_f,$enc,$BD1,$BDL2", []>;
-  def InsnSSE : DirectiveInsnSSE<(outs),
-                                 (ins imm64zx48:$enc,
-                                      (bdaddr12only $B1, $D1):$BD1,(bdaddr12only $B2, $D2):$BD2),
-                                 ".insn sse,$enc,$BD1,$BD2", []>;
-  def InsnSSF : DirectiveInsnSSF<(outs),
-                                 (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
-                                      (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
-                                 ".insn ssf,$enc,$BD1,$BD2,$R3", []>;
-  def InsnVRI
-      : DirectiveInsnVRIe<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                              imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
-                          ".insn vri,$enc,$V1,$V2,$I3,$M4,$M5", []>;
-  def InsnVRIa : DirectiveInsnVRIa<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1,
-                                       imm32xx16:$I2, imm32zx4:$M3),
-                                   ".insn vri_a,$enc,$V1,$I2,$M3", []>;
-  def InsnVRIb : DirectiveInsnVRIb<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, imm32zx8:$I2,
-                                       imm32zx8:$I3, imm32zx4:$M4),
-                                   ".insn vri_b,$enc,$V1,$I2,$I3,$M4", []>;
-  def InsnVRIc : DirectiveInsnVRIc<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1,
-                                       imm32zx16:$I2, VR128:$V3, imm32zx4:$M4),
-                                   ".insn vri_c,$enc,$V1,$I2,$V3,$M4", []>;
-  def InsnVRId : DirectiveInsnVRId<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                       VR128:$V3, imm32zx8:$I4, imm32zx4:$M5),
-                                   ".insn vri_d,$enc,$V1,$V2,$V3,$I4,$M5", []>;
-  def InsnVRIe
-      : DirectiveInsnVRIe<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                              imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
-                          ".insn vri_e,$enc,$V1,$V2,$I3,$M4,$M5", []>;
-  def InsnVRIf : DirectiveInsnVRIf<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                       VR128:$V3, imm32zx8:$I4, imm32zx4:$M5),
-                                   ".insn vri_f,$enc,$V1,$V2,$V3,$I4,$M5", []>;
-  def InsnVRIg
-      : DirectiveInsnVRIg<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                              imm32zx8:$I3, imm32zx16:$I4, imm32zx4:$M5),
-                          ".insn vri_g,$enc,$V1,$V2,$I3,$I4,$M5", []>;
-  def InsnVRIh
-      : DirectiveInsnVRIh<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2,
-                              imm32zx4:$I3, imm32zx4:$M4),
-                          ".insn vri_h,$enc,$V1,$I2,$I3,$M4", []>;
-  def InsnVRIi : DirectiveInsnVRIi<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, AnyReg:$R2,
-                                       imm32zx8:$I3, imm32zx4:$M4),
-                                   ".insn vri_i,$enc,$V1,$R2,$I3,$M4", []>;
-  def InsnVRIj : DirectiveInsnVRIj<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                       imm32zx8:$I3, imm32zx4:$M4),
-                                   ".insn vri_j,$enc,$V1,$V2,$I3,$M4", []>;
-  def InsnVRIk : DirectiveInsnVRIk<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                       VR128:$V3, VR128:$V4, imm32zx8:$I5),
-                                   ".insn vri_k,$enc,$V1,$V2,$V3,$V4,$I5", []>;
-  def InsnVRIl
-      : DirectiveInsnVRIl<
-            (outs), (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx16:$I3),
-            ".insn vri_l,$enc,$V1,$V2,$I3", []>;
-  def InsnVRR
-      : DirectiveInsnVRRc<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
-                              imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
-                          ".insn vrr,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>;
-  def InsnVRRa
-      : DirectiveInsnVRRa<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                              imm32zx4:$M3, imm32zx4:$M4, imm32zx4:$M5),
-                          ".insn vrr_a,$enc,$V1,$V2,$M3,$M4,$M5", []>;
-  def InsnVRRb : DirectiveInsnVRRb<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                       VR128:$V3, imm32zx4:$M4, imm32zx4:$M5),
-                                   ".insn vrr_b,$enc,$V1,$V2,$V3,$M4,$M5", []>;
-  def InsnVRRc
-      : DirectiveInsnVRRc<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
-                              imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
-                          ".insn vrr_c,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>;
-  def InsnVRRd
-      : DirectiveInsnVRRd<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
-                              VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
-                          ".insn vrr_d,$enc,$V1,$V2,$V3,$V4,$M5,$M6", []>;
-  def InsnVRRe
-      : DirectiveInsnVRRe<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
-                              VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
-                          ".insn vrr_e,$enc,$V1,$V2,$V3,$V4,$M5,$M6", []>;
-  def InsnVRRf
-      : DirectiveInsnVRRf<
-            (outs), (ins imm64zx48:$enc, VR128:$V1, AnyReg:$R2, AnyReg:$R3),
-            ".insn vrr_f,$enc,$V1,$R2,$R3", []>;
-  def InsnVRRg
-      : DirectiveInsnVRRg<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2),
-                          ".insn vrr_g,$enc,$V1,$I2", []>;
-  def InsnVRRh
-      : DirectiveInsnVRRh<
-            (outs), (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3),
-            ".insn vrr_h,$enc,$V1,$V2,$M3", []>;
-  def InsnVRRi : DirectiveInsnVRRi<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V2,
-                                       imm32zx4:$M3, imm32zx4:$M4),
-                                   ".insn vrr_i,$enc,$R1,$V2,$M3", []>;
-  def InsnVRRj : DirectiveInsnVRRj<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
-                                       VR128:$V3, imm32zx4:$M4),
-                                   ".insn vrr_j,$enc,$V1,$V2,$V3,$M4", []>;
-  def InsnVRRk
-      : DirectiveInsnVRRk<
-            (outs), (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3),
-            ".insn vrr_k,$enc,$V1,$V2,$M3", []>;
-  def InsnVRS
-      : DirectiveInsnVRSc<(outs),
-                          (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V3,
-                              (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M4),
-                          ".insn vrs,$enc,$R1,$V3,$BD2,$M4", []>;
-  def InsnVRSa : DirectiveInsnVRSa<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1,
-                                       (bdaddr12only $B2, $D2):$BD2, VR128:$V3,
-                                       imm32zx4:$M4),
-                                   ".insn_a vrs_a,$enc,$V1,$BD2,$V3,$M4", []>;
-  def InsnVRSb : DirectiveInsnVRSb<(outs),
-                                   (ins imm64zx48:$enc, VR128:$V1,
-                                       (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3,
-                                       imm32zx4:$M4),
-                                   ".insn vrs_b,$enc,$V1,$BD2,$R3,$M4", []>;
-  def InsnVRSc : DirectiveInsnVRSc<(outs),
-                                   (ins imm64zx48:$enc, AnyReg:$R1,
-                                       (bdaddr12only $B2, $D2):$BD2, VR128:$V3,
-                                       imm32zx4:$M4),
-                                   ".insn vrs_c,$enc,$R1,$BD2,$V3,$M4", []>;
-  def InsnVRSd
-      : DirectiveInsnVRSd<(outs),
-                          (ins imm64zx48:$enc, VR128:$V1,
-                              (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
-                          ".insn vrs_d,$enc,$V1,$BD2,$R3", []>;
-  def InsnVRV : DirectiveInsnVRV<(outs),
-                                 (ins imm64zx48:$enc, VR128:$V1,
-                                      (bdvaddr12only $B2, $D2, $V2):$VBD2, imm32zx4:$M3),
-                                 ".insn vrv,$enc,$V1,$VBD2,$M3", []>;
-  def InsnVRX : DirectiveInsnVRX<(outs),
-                                 (ins imm64zx48:$enc, VR128:$V1,
-                                  (bdxaddr12only $B2, $D2, $X2):$XBD2, imm32zx4:$M3),
-                                 ".insn vrx,$enc,$V1,$XBD2,$M3", []>;
-  def InsnVSI : DirectiveInsnVSI<(outs),
-                                 (ins imm64zx48:$enc, VR128:$V1,
-                                  (bdaddr12only $B2, $D2):$BD2, imm32zx8:$I3),
-                                  ".insn vsi,$enc,$V1,$BD2,$I3", []>;
+def InsnE : InstE<0, (outs), (ins imm64zx16:$enc), ".insn e,$enc", []>,
+            InsnDirectiveBase {
+  bits<16> enc;
+  let Inst = enc;
+}
+def InsnI : InstI<0, (outs), (ins imm64zx16:$enc, imm32zx8:$I1),
+                  ".insn i,$enc,$I1", []>,
+            InsnDirectiveBase {
+  bits<16> enc;
+  let Inst{15-8} = enc{15-8};
+}
+def InsnIE : InstIE<0, (outs), (ins imm64zx32:$enc, imm32zx4:$I1, imm32zx4:$I2),
+                    ".insn ie,$enc,$I1,$I2", []>,
+             InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-16} = enc{31-16};
+}
+def InsnMII : InstMII<0, (outs),
+                      (ins imm64zx48:$enc, imm32zx4:$M1, brtarget12bpp:$RI2,
+                          brtarget24bpp:$RI3),
+                      ".insn mii,$enc,$M1,$RI2,$RI3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnRI : InstRIa<0, (outs), (ins imm64zx32:$enc, AnyReg:$R1, imm32sx16:$I2),
+                     ".insn ri,$enc,$R1,$I2", []>,
+             InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+  let Inst{19-16} = enc{19-16};
+}
+def InsnRIa
+    : InstRIa<0, (outs), (ins imm64zx32:$enc, AnyReg:$R1, imm32xx16:$I2),
+                       ".insn ri_a,$enc,$R1,$I2", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+  let Inst{19-16} = enc{19-16};
+}
+def InsnRIb
+    : InstRIb<0, (outs), (ins imm64zx32:$enc, AnyReg:$R1, brtarget16:$RI2),
+              ".insn ri_b,$enc,$R1,$RI2", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+  let Inst{19-16} = enc{19-16};
+}
+def InsnRIc
+    : InstRIc<0, (outs), (ins imm64zx32:$enc, imm32zx4:$M1, brtarget16:$RI2),
+              ".insn ri_c,$enc,$M1,$RI2", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+  let Inst{19-16} = enc{19-16};
+}
+// RIE base format - legacy operand order preserved
+def InsnRIE
+    : InstRIEd<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3, brtarget16:$I2),
+               ".insn rie,$enc,$R1,$R3,$I2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEa
+    : InstRIEa<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1, imm32xx16:$I2, imm32zx4:$M3),
+               ".insn rie_a,$enc,$R1,$I2,$M3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEb : InstRIEb<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2,
+                            imm32zx4:$M3, brtarget16:$RI4),
+                        ".insn rie_b,$enc,$R1,$R2,$M3,$RI4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEc : InstRIEc<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1, imm32xx8:$I2,
+                            imm32zx4:$M3, brtarget16:$RI4),
+                        ".insn rie_c,$enc,$R1,$I2,$M3,$RI4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEd
+    : InstRIEd<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1, imm32sx16:$I2, AnyReg:$R3),
+               ".insn rie_d,$enc,$R1,$I2,$R3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEe
+    : InstRIEe<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1, brtarget16:$RI2, AnyReg:$R3),
+               ".insn rie_e,$enc,$R1,$RI2,$R3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEf : InstRIEf<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2,
+                            imm32zx8:$I3, imm32zx8:$I4, imm32zx8:$I5),
+                        ".insn rie_f,$enc,$R1,$R2,$I3,$I4,$I5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIEg
+    : InstRIEg<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1, imm32sx16:$I2, imm32zx4:$M3),
+               ".insn rie_g,$enc,$R1,$I2,$M3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRIL
+    : InstRILa<0, (outs), (ins imm64zx48:$enc, AnyReg:$R1, brtarget32:$I2),
+               ".insn ril,$enc,$R1,$I2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{35-32} = enc{35-32};
+}
+def InsnRILa
+    : InstRILa<0, (outs), (ins imm64zx48:$enc, AnyReg:$R1, imm64xx32:$I2),
+               ".insn ril_a,$enc,$R1,$I2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{35-32} = enc{35-32};
+}
+def InsnRILb
+    : InstRILb<0, (outs), (ins imm64zx48:$enc, AnyReg:$R1, brtarget32:$RI2),
+               ".insn ril_b,$enc,$R1,$RI2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{35-32} = enc{35-32};
+}
+def InsnRILc
+    : InstRILc<0, (outs), (ins imm64zx48:$enc, imm32zx4:$M1, brtarget32:$RI2),
+               ".insn ril_c,$enc,$M1,$RI2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{35-32} = enc{35-32};
+}
+def InsnRILU : InstRILa<0, (outs), (ins imm64zx48:$enc, AnyReg:$R1, uimm32:$I2),
+                        ".insn rilu,$enc,$R1,$I2", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{35-32} = enc{35-32};
+}
+def InsnRIS : InstRIS<0, (outs),
+                      (ins imm64zx48:$enc, AnyReg:$R1, imm32xx8:$I2,
+                          imm32zx4:$M3, (bdaddr12only $B4, $D4):$BD4),
+                      ".insn ris,$enc,$R1,$I2,$M3,$BD4", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRR : InstRR<0, (outs), (ins imm64zx16:$enc, AnyReg:$R1, AnyReg:$R2),
+                    ".insn rr,$enc,$R1,$R2", []>,
+             InsnDirectiveBase {
+  bits<16> enc;
+
+  let Inst{15-8} = enc{15-8};
+}
+def InsnRRD : InstRRD<0, (outs),
+                      (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3),
+                      ".insn rrd,$enc,$R1,$R2,$R3", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRE : InstRRE<0, (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2),
+                      ".insn rre,$enc,$R1,$R2", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRF : InstRRFa<0, (outs),
+                       (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3,
+                           imm32zx4:$M4),
+                       ".insn rrf,$enc,$R1,$R2,$R3,$M4", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRFa : InstRRFa<0, (outs),
+                        (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3,
+                            imm32zx4:$M4),
+                        ".insn rrf_a,$enc,$R1,$R2,$R3,$M4", []>,
+               InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRFb : InstRRFb<0, (outs),
+                        (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3,
+                            imm32zx4:$M4),
+                        ".insn rrf_b,$enc,$R1,$R2,$R3,$M4", []>,
+               InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRFc
+    : InstRRFc<0, (outs),
+               (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M3),
+               ".insn rrf_c,$enc,$R1,$R2,$M3", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRFd
+    : InstRRFd<0, (outs),
+               (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M4),
+               ".insn rrf_d,$enc,$R1,$R2,$M4", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRFe : InstRRFe<0, (outs),
+                        (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2,
+                            imm32zx4:$M3, imm32zx4:$M4),
+                        ".insn rrf_e,$enc,$R1,$R2,$M3,$M4", []>,
+               InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-16} = enc{31-16};
+}
+def InsnRRS : InstRRS<0, (outs),
+                      (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R2, imm32zx4:$M3,
+                          (bdaddr12only $B4, $D4):$BD4),
+                      ".insn rrs,$enc,$R1,$R2,$M3,$BD4", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+// RS - legacy operand order preserved
+def InsnRS : InstRSa<0, (outs),
+                     (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R3,
+                         (bdaddr12only $B2, $D2):$BD2),
+                     ".insn rs,$enc,$R1,$R3,$BD2", []>,
+             InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-24} = enc{31-24};
+}
+def InsnRSa : InstRSa<0, (outs),
+                      (ins imm64zx32:$enc, AnyReg:$R1,
+                          (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                      ".insn rs_a,$enc,$R1,$BD2,$R3", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-24} = enc{31-24};
+}
+def InsnRSb : InstRSb<0, (outs),
+                      (ins imm64zx32:$enc, AnyReg:$R1,
+                          (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M3),
+                      ".insn rs_b,$enc,$R1,$BD2,$M3", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-24} = enc{31-24};
+}
+// RRSE - legacy operand order preserved
+def InsnRSE : InstRSEa<6, (outs),
+                       (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
+                           (bdaddr12only $B2, $D2):$BD2),
+                       ".insn rse,$enc,$R1,$R3,$BD2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+// RSI - legacy operand order preserved
+def InsnRSI
+    : InstRSI<0, (outs),
+              (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3, brtarget16:$RI2),
+              ".insn rsi,$enc,$R1,$R3,$RI2", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+
+  let Inst{31-24} = enc{31-24};
+}
+def InsnRSLa
+    : InstRSLa<0, (outs),
+               (ins imm64zx48:$enc, (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1),
+               ".insn rsl_a,$enc,$BDL1", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRSLb
+    : InstRSLb<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1,
+                   (bdladdr12onlylen8 $B2, $D2, $L2):$BDL2, imm32zx4:$M3),
+               ".insn rsl_b,$enc,$R1,$BDL2,$M3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+// RSY - legacy operand order preserved
+def InsnRSY : InstRSYa<0, (outs),
+                       (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
+                           (bdaddr20only $B2, $D2):$BD2),
+                       ".insn rsy,$enc,$R1,$R3,$BD2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRSYa : InstRSYa<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1,
+                            (bdaddr20only $B2, $D2):$BD2, AnyReg:$R3),
+                        ".insn rsy_a,$enc,$R1,$BD2,$R3", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRSYb : InstRSYb<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1,
+                            (bdaddr20only $B2, $D2):$BD2, imm32zx4:$M3),
+                        ".insn rsy_b,$enc,$R1,$BD2,$M3", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRX : InstRXa<0, (outs),
+                     (ins imm64zx32:$enc, AnyReg:$R1,
+                         (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                     ".insn rx,$enc,$R1,$XBD2", []>,
+             InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+}
+def InsnRXa : InstRXa<0, (outs),
+                      (ins imm64zx32:$enc, AnyReg:$R1,
+                          (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                      ".insn rx_a,$enc,$R1,$XBD2", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+}
+def InsnRXb : InstRXb<0, (outs),
+                      (ins imm64zx32:$enc, imm32zx4:$M1,
+                          (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                      ".insn rx_b,$enc,$M1,$XBD2", []>,
+              InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+}
+def InsnRXE : InstRXE<0, (outs),
+                      (ins imm64zx48:$enc, AnyReg:$R1,
+                          (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                      ".insn rxe,$enc,$R1,$XBD2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let M3 = 0;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+// RXF - legacy operand order preserved
+def InsnRXF : InstRXF<0, (outs),
+                      (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
+                          (bdxaddr12only $B2, $D2, $X2):$XBD2),
+                      ".insn rxf,$enc,$R1,$R3,$XBD2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+// RXY - legacy operand order preserved
+def InsnRXY : InstRXYa<0, (outs),
+                       (ins imm64zx48:$enc, AnyReg:$R1,
+                           (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                       ".insn rxy,$enc,$R1,$XBD2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRXYa : InstRXYa<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1,
+                            (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                        ".insn rxy_a,$enc,$R1,$XBD2", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRXYb : InstRXYb<0, (outs),
+                        (ins imm64zx48:$enc, imm32zx4:$M1,
+                            (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                        ".insn rxy_b,$enc,$M1,$XBD2", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnRXYc : InstRXYa<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1,
+                            (bdxaddr20only $B2, $D2, $X2):$XBD2),
+                        ".insn rxy_c,$enc,$R1,$XBD2", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnS : InstS<0, (outs), (ins imm64zx32:$enc, (bdaddr12only $B2, $D2):$BD2),
+                  ".insn s,$enc,$BD2", []>,
+            InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-16} = enc{31-16};
+}
+def InsnSI
+    : InstSI<0, (outs),
+             (ins imm64zx32:$enc, (bdaddr12only $B1, $D1):$BD1, imm32xx8:$I2),
+             ".insn si,$enc,$BD1,$I2", []>,
+      InsnDirectiveBase {
+  bits<32> enc;
+  let Inst{31-24} = enc{31-24};
+}
+def InsnSIY
+    : InstSIY<0, (outs),
+              (ins imm64zx48:$enc, (bdaddr20only $B1, $D1):$BD1, imm32xx8:$I2),
+              ".insn siy,$enc,$BD1,$I2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnSIL
+    : InstSIL<0, (outs),
+              (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1, imm32xx16:$I2),
+              ".insn sil,$enc,$BD1,$I2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-32} = enc{47-32};
+}
+def InsnSMI : InstSMI<0, (outs),
+                      (ins imm64zx48:$enc, imm32zx4:$M1, brtarget16bpp:$RI2,
+                          (bdaddr12only $B3, $D3):$BD3),
+                      ".insn smi,$enc,$M1,$RI2,$BD3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSS : InstSSd<0, (outs),
+                     (ins imm64zx48:$enc, (bdraddr12only $B1, $D1, $R1):$RBD1,
+                         (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                     ".insn ss,$enc,$RBD1,$BD2,$R3", []>,
+             InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSa
+    : InstSSa<0, (outs),
+              (ins imm64zx48:$enc, (bdladdr12onlylen8 $B1, $D1, $L1):$BDL1,
+                  (bdaddr12only $B2, $D2):$BD2),
+              ".insn ss_a,$enc,$BDL1,$BD2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSb
+    : InstSSb<0, (outs),
+              (ins imm64zx48:$enc, (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1,
+                  (bdladdr12onlylen4 $B2, $D2, $L2):$BDL2),
+              ".insn ss_b,$enc,$BDL1,$BDL2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSc
+    : InstSSc<0, (outs),
+              (ins imm64zx48:$enc, (bdladdr12onlylen4 $B1, $D1, $L1):$BDL1,
+                  (bdaddr12only $B2, $D2):$BD2, imm32zx4:$I3),
+              ".insn ss_c,$enc,$BDL1,$BD2,$I3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSd : InstSSd<0, (outs),
+                      (ins imm64zx48:$enc, (bdraddr12only $B1, $D1, $R1):$RBD1,
+                          (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                      ".insn ss_d,$enc,$RBD1,$BD2,$R3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSe
+    : InstSSe<0, (outs),
+              (ins imm64zx48:$enc, AnyReg:$R1, (bdaddr12only $B2, $D2):$BD2,
+                  AnyReg:$R3, (bdaddr12only $B4, $D4):$BD4),
+              ".insn ss_e,$enc,$R1,$BD2,$R3,$BD4", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSf : InstSSf<0, (outs),
+                      (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
+                          (bdladdr12onlylen8 $B2, $D2, $L2):$BDL2),
+                      ".insn ss_f,$enc,$BD1,$BDL2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+}
+def InsnSSE : InstSSE<0, (outs),
+                      (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
+                          (bdaddr12only $B2, $D2):$BD2),
+                      ".insn sse,$enc,$BD1,$BD2", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-32} = enc{47-32};
+}
+def InsnSSF : InstSSF<0, (outs),
+                      (ins imm64zx48:$enc, (bdaddr12only $B1, $D1):$BD1,
+                          (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                      ".insn ssf,$enc,$BD1,$BD2,$R3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{35-32} = enc{35-32};
+}
+def InsnVRI : InstVRIe<0, (outs),
+                       (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx12:$I3,
+                           imm32zx4:$M4, imm32zx4:$M5),
+                       ".insn vri,$enc,$V1,$V2,$I3,$M4,$M5", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIa
+    : InstVRIa<0, (outs),
+               (ins imm64zx48:$enc, VR128:$V1, imm32xx16:$I2, imm32zx4:$M3),
+               ".insn vri_a,$enc,$V1,$I2,$M3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIb : InstVRIb<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, imm32zx8:$I2,
+                            imm32zx8:$I3, imm32zx4:$M4),
+                        ".insn vri_b,$enc,$V1,$I2,$I3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIc : InstVRIc<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2,
+                            VR128:$V3, imm32zx4:$M4),
+                        ".insn vri_c,$enc,$V1,$I2,$V3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRId : InstVRId<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            imm32zx8:$I4, imm32zx4:$M5),
+                        ".insn vri_d,$enc,$V1,$V2,$V3,$I4,$M5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIe : InstVRIe<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2,
+                            imm32zx12:$I3, imm32zx4:$M4, imm32zx4:$M5),
+                        ".insn vri_e,$enc,$V1,$V2,$I3,$M4,$M5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIf : InstVRIf<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            imm32zx8:$I4, imm32zx4:$M5),
+                        ".insn vri_f,$enc,$V1,$V2,$V3,$I4,$M5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIg : InstVRIg<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx8:$I3,
+                            imm32zx8:$I4, imm32zx4:$M5),
+                        ".insn vri_g,$enc,$V1,$V2,$I3,$I4,$M5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIh : InstVRIh<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2,
+                            imm32zx4:$I3, imm32zx4:$M4),
+                        ".insn vri_h,$enc,$V1,$I2,$I3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIi : InstVRIi<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, AnyReg:$R2,
+                            imm32zx8:$I3, imm32zx4:$M4),
+                        ".insn vri_i,$enc,$V1,$R2,$I3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIj : InstVRIj<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx8:$I3,
+                            imm32zx4:$M4),
+                        ".insn vri_j,$enc,$V1,$V2,$I3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIk : InstVRIk<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            VR128:$V4, imm32zx8:$I5),
+                        ".insn vri_k,$enc,$V1,$V2,$V3,$V4,$I5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRIl
+    : InstVRIl<0, (outs),
+               (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx16:$I3),
+               ".insn vri_l,$enc,$V1,$V2,$I3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRR : InstVRRc<0, (outs),
+                       (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                           imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
+                       ".insn vrr,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRa : InstVRRa<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3,
+                            imm32zx4:$M4, imm32zx4:$M5),
+                        ".insn vrr_a,$enc,$V1,$V2,$M3,$M4,$M5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRb : InstVRRb<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            imm32zx4:$M4, imm32zx4:$M5),
+                        ".insn vrr_b,$enc,$V1,$V2,$V3,$M4,$M5", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRc : InstVRRc<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
+                        ".insn vrr_c,$enc,$V1,$V2,$V3,$M4,$M5,$M6", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRd : InstVRRd<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
+                        ".insn vrr_d,$enc,$V1,$V2,$V3,$V4,$M5,$M6", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRe : InstVRRe<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            VR128:$V4, imm32zx4:$M5, imm32zx4:$M6),
+                        ".insn vrr_e,$enc,$V1,$V2,$V3,$V4,$M5,$M6", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRf : InstVRRf<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, AnyReg:$R2, AnyReg:$R3),
+                        ".insn vrr_f,$enc,$V1,$R2,$R3", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRg
+    : InstVRRg<0, (outs), (ins imm64zx48:$enc, VR128:$V1, imm32zx16:$I2),
+               ".insn vrr_g,$enc,$V1,$I2", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRh
+    : InstVRRh<0, (outs),
+               (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3),
+               ".insn vrr_h,$enc,$V1,$V2,$M3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRi : InstVRRi<0, (outs),
+                        (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V2,
+                            imm32zx4:$M3, imm32zx4:$M4),
+                        ".insn vrr_i,$enc,$R1,$V2,$M3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRj : InstVRRj<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
+                            imm32zx4:$M4),
+                        ".insn vrr_j,$enc,$V1,$V2,$V3,$M4", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRRk
+    : InstVRRk<0, (outs),
+               (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx4:$M3),
+               ".insn vrr_k,$enc,$V1,$V2,$M3", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+// VRS - legacy operand order preserved
+def InsnVRS : InstVRSc<0, (outs),
+                       (ins imm64zx48:$enc, AnyReg:$R1, VR128:$V3,
+                           (bdaddr12only $B2, $D2):$BD2, imm32zx4:$M4),
+                       ".insn vrs,$enc,$R1,$V3,$BD2,$M4", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRSa
+    : InstVRSa<0, (outs),
+               (ins imm64zx48:$enc, VR128:$V1, (bdaddr12only $B2, $D2):$BD2,
+                   VR128:$V3, imm32zx4:$M4),
+               ".insn vrs_a,$enc,$V1,$BD2,$V3,$M4", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRSb
+    : InstVRSb<0, (outs),
+               (ins imm64zx48:$enc, VR128:$V1, (bdaddr12only $B2, $D2):$BD2,
+                   AnyReg:$R3, imm32zx4:$M4),
+               ".insn vrs_b,$enc,$V1,$BD2,$R3,$M4", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRSc
+    : InstVRSc<0, (outs),
+               (ins imm64zx48:$enc, AnyReg:$R1, (bdaddr12only $B2, $D2):$BD2,
+                   VR128:$V3, imm32zx4:$M4),
+               ".insn vrs_c,$enc,$R1,$BD2,$V3,$M4", []>,
+      InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRSd : InstVRSd<0, (outs),
+                        (ins imm64zx48:$enc, VR128:$V1,
+                            (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
+                        ".insn vrs_d,$enc,$V1,$BD2,$R3", []>,
+               InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRV : InstVRV<0, (outs),
+                      (ins imm64zx48:$enc, VR128:$V1,
+                          (bdvaddr12only $B2, $D2, $V2):$VBD2, imm32zx4:$M3),
+                      ".insn vrv,$enc,$V1,$VBD2,$M3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVRX : InstVRX<0, (outs),
+                      (ins imm64zx48:$enc, VR128:$V1,
+                          (bdxaddr12only $B2, $D2, $X2):$XBD2, imm32zx4:$M3),
+                      ".insn vrx,$enc,$V1,$XBD2,$M3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
+}
+def InsnVSI : InstVSI<0, (outs),
+                      (ins imm64zx48:$enc, VR128:$V1,
+                          (bdaddr12only $B2, $D2):$BD2, imm32zx8:$I3),
+                      ".insn vsi,$enc,$V1,$BD2,$I3", []>,
+              InsnDirectiveBase {
+  bits<48> enc;
+  let Inst{47-40} = enc{47-40};
+  let Inst{7-0} = enc{7-0};
 }
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/test/MC/SystemZ/directive-insn-bad.s b/llvm/test/MC/SystemZ/directive-insn-bad.s
new file mode 100644
index 0000000000000..63a4212501378
--- /dev/null
+++ b/llvm/test/MC/SystemZ/directive-insn-bad.s
@@ -0,0 +1,97 @@
+# RUN: not llvm-mc -triple s390x-linux-gnu %s 2>&1 | FileCheck %s
+
+# CHECK: error: unrecognized format
+# CHECK: .insn not_a_format,0x0
+        .insn not_a_format,0x0
+
+# CHECK: error: unexpected token in directive
+# CHECK: .insn rr,0x0101
+        .insn rr,0x0101
+
+# CHECK: error: unexpected token at start of statement
+# CHECK: .insn e,0x0101,0
+        .insn e,0x0101,0
+
+# CHECK: error: unexpected token in directive
+# CHECK: .insn rr,0x1800,0
+        .insn rr,0x1800,0
+
+# CHECK: error: unexpected token at start of statement
+# CHECK: .insn rr,0x1800,%r1,0(%r2)
+        .insn rr,0x1800,%r1,0(%r2)
+
+# CHECK: error: unknown token in expression
+# CHECK: .insn rxy_a,0xe30000000016,%r1,%r2,0
+        .insn rxy_a,0xe30000000016,%r1,%r2,0
+
+# CHECK: error: unknown token in expression
+# CHECK: .insn ril_c,0xc00400000000,%r1,0
+        .insn ril_c,0xc00400000000,%r1,0
+
+# CHECK: error: invalid operand for instruction
+# CHECK: .insn vri_e,0xe7000000004a,%r1,%v2,837,7,6
+        .insn vri_e,0xe7000000004a,%r1,%v2,837,7,6
+
+# Test immediate value range validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn ri,0xa7080000,%r1,0x10000
+        .insn ri,0xa7080000,%r1,0x10000        # 16-bit immediate, value too large (max 0xFFFF)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn ri,0xa7090000,%r1,0x8000
+        .insn ri,0xa7090000,%r1,0x8000         # 16-bit signed immediate, value too large (max 0x7FFF)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn ri,0xa7090000,%r1,-0x8001
+        .insn ri,0xa7090000,%r1,-0x8001        # 16-bit signed immediate, value too small (min -0x8000)
+
+# CHECK: error: offset out of range
+# CHECK: .insn ril,0xc20b00000000,%r2,0x100000000
+        .insn ril,0xc20b00000000,%r2,0x100000000  # 32-bit immediate, value too large
+
+# Test displacement range validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rx,0x5a000000,%r1,4096(%r2)
+        .insn rx,0x5a000000,%r1,4096(%r2)      # 12-bit displacement, value too large (max 4095)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rx,0x5a000000,%r1,-1(%r2)
+        .insn rx,0x5a000000,%r1,-1(%r2)        # 12-bit unsigned displacement, negative value
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rxy,0xe30000000004,%r1,524288(%r2)
+        .insn rxy,0xe30000000004,%r1,524288(%r2)  # 20-bit displacement, value too large (max 524287)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rxy,0xe30000000004,%r1,-524289(%r2)
+        .insn rxy,0xe30000000004,%r1,-524289(%r2) # 20-bit signed displacement, value too small (min -524288)
+
+# Test mask/field range validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rie_c,0xec000000007e,%r1,256,2,0
+        .insn rie_c,0xec000000007e,%r1,256,2,0    # 8-bit immediate field, value too large (max 255)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rie_f,0xec000000005d,%r1,%r2,256,202,222
+        .insn rie_f,0xec000000005d,%r1,%r2,256,202,222  # 8-bit field, value too large
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rie_f,0xec000000005d,%r1,%r2,250,256,222
+        .insn rie_f,0xec000000005d,%r1,%r2,250,256,222  # 8-bit field, value too large
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rie_f,0xec000000005d,%r1,%r2,250,202,256
+        .insn rie_f,0xec000000005d,%r1,%r2,250,202,256  # 8-bit field, value too large
+
+# Test signed vs unsigned immediate validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rilu,0xc20b00000000,%r2,-1
+        .insn rilu,0xc20b00000000,%r2,-1           # rilu expects unsigned 32-bit, negative value rejected
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn sil,0xe56000000000,160(%r15),-32769
+        .insn sil,0xe56000000000,160(%r15),-32769  # sil expects unsigned 16-bit, value too negative
diff --git a/llvm/test/MC/SystemZ/directive-insn-z13.s b/llvm/test/MC/SystemZ/directive-insn-z13.s
index 19d5e6dd76e1f..29b7659d7a02f 100644
--- a/llvm/test/MC/SystemZ/directive-insn-z13.s
+++ b/llvm/test/MC/SystemZ/directive-insn-z13.s
@@ -56,4 +56,9 @@ label.START:
 
 #CHECK: e7 12 34 56 70 21      vlgv %r1, %v2, 1110(%r3), 7
       .insn vrs_c,0xe70000000021,%r1,1110(%r3),%v2,7
+#CHECK: e7 16 00 00 30 21     vlgvg %r1, %v6, 0
+      .insn vrs,0xe70000000021,%r1,%v6,0(%r0),3
+#CHECK: e7 12 30 00 00 62      vlvgp %v1, %r2, %r3
+      .insn vrr_f,0xe70000000062,%v1,%r2,%r3
+
 
diff --git a/llvm/test/MC/SystemZ/directive-insn.s b/llvm/test/MC/SystemZ/directive-insn.s
index 5827e13497f61..980578e561e78 100644
--- a/llvm/test/MC/SystemZ/directive-insn.s
+++ b/llvm/test/MC/SystemZ/directive-insn.s
@@ -232,3 +232,10 @@ label.rsi:
 
 #CHECK: e9 12 34 56 78 90      pka 1110(%r3), 2192(19,%r7)
       .insn ss_f,0xe90000000000,1110(%r3),2192(19,%r7)
+
+#CHECK: c0 04 00 00 00 03      jgnop 0x17a
+      .insn ril_c,0xc00400000000,0,label.autogen_ril_c
+label.autogen_ril_c:
+
+#CHECK: e3 12 34 56 78 16      llgf %r1, 492630(%r2,%r3)
+      .insn rxy_a,0xe30000000016,%r1,492630(%r2,%r3)
diff --git a/llvm/utils/TableGen/CMakeLists.txt b/llvm/utils/TableGen/CMakeLists.txt
index e18279cffa74c..4f6957b93275b 100644
--- a/llvm/utils/TableGen/CMakeLists.txt
+++ b/llvm/utils/TableGen/CMakeLists.txt
@@ -73,6 +73,7 @@ add_tablegen(llvm-tblgen LLVM
   X86MnemonicTables.cpp
   X86ModRMFilters.cpp
   X86RecognizableInstr.cpp
+  SystemZInsnDirectiveEmitter.cpp
   $<TARGET_OBJECTS:obj.LLVMTableGenBasic>
   $<TARGET_OBJECTS:obj.LLVMTableGenCommon>
 
diff --git a/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp b/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp
new file mode 100644
index 0000000000000..25eda39b3d44e
--- /dev/null
+++ b/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp
@@ -0,0 +1,135 @@
+//===- SystemZInsnDirectiveEmitter.cpp - Generate .insn match table -------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This tablegen backend emits a match table for SystemZ .insn directives.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/ADT/StringMap.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/TableGen/Error.h"
+#include "llvm/TableGen/Record.h"
+#include "llvm/TableGen/TableGenBackend.h"
+#include <string>
+
+using namespace llvm;
+
+namespace {
+
+struct InsnMatchEntry {
+  std::string Format;
+  std::string Opcode;
+  SmallVector<std::string, 8> OperandKinds;
+};
+
+static StringRef getFormatName(const Record &Def) {
+  StringRef AsmString = Def.getValueAsString("AsmString");
+  if (!AsmString.consume_front(".insn "))
+    PrintFatalError(&Def, "expected .insn asm string");
+  return AsmString.take_until([](char C) { return C == ','; });
+}
+
+static StringRef getMatchClassKind(const Record &Def, const Init *Arg,
+                                   unsigned OperandIndex) {
+  static const StringMap<StringRef> KindMap = {
+      {"AnyReg", "MCK_AnyReg"},
+      {"VR128", "MCK_VR128"},
+      {"brtarget12", "MCK_PCRel12"},
+      {"brtarget12bpp", "MCK_PCRel12"},
+      {"brtarget16", "MCK_PCRel16"},
+      {"brtarget16bpp", "MCK_PCRel16"},
+      {"brtarget24bpp", "MCK_PCRel24"},
+      {"brtarget32", "MCK_PCRel32"},
+      {"uimm32", "MCK_U32Imm"},
+      {"imm32zx4", "MCK_U4Imm"},
+      {"imm32zx8", "MCK_U8Imm"},
+      {"imm32sx8", "MCK_S8Imm"},
+      {"imm32xx8", "MCK_X8Imm"},
+      {"imm32zx12", "MCK_U12Imm"},
+      {"imm32zx16", "MCK_U16Imm"},
+      {"imm32sx16", "MCK_S16Imm"},
+      {"imm32xx16", "MCK_X16Imm"},
+      {"imm64zx16", "MCK_U16Imm"},
+      {"imm64zx32", "MCK_U32Imm"},
+      {"imm64xx32", "MCK_X32Imm"},
+      {"imm64zx48", "MCK_U48Imm"},
+      {"bdxaddr12only", "MCK_BDXAddr64Disp12"},
+      {"bdxaddr20only", "MCK_BDXAddr64Disp20"},
+      {"bdaddr12only", "MCK_BDAddr64Disp12"},
+      {"bdaddr20only", "MCK_BDAddr64Disp20"},
+      {"bdvaddr12only", "MCK_BDVAddr64Disp12"},
+      {"bdladdr12onlylen4", "MCK_BDLAddr64Disp12Len4"},
+      {"bdladdr12onlylen8", "MCK_BDLAddr64Disp12Len8"},
+      {"bdraddr12only", "MCK_BDRAddr64Disp12"}};
+
+  std::string ArgTextStorage = Arg->getAsString();
+  StringRef ArgText(ArgTextStorage);
+  if (!ArgText.empty() && ArgText.front() == '(') {
+    ArgText = ArgText.drop_front();
+    ArgText = ArgText.take_while([](char C) { return C != ' '; });
+  }
+
+  // Check registered mappings
+  auto It = KindMap.find(ArgText);
+  if (It != KindMap.end())
+    return It->second;
+
+  PrintFatalError(&Def, "unsupported operand kind in .insn directive operand " +
+                            Twine(OperandIndex) + ": " + ArgText);
+}
+
+static InsnMatchEntry buildInsnMatchEntry(const Record &Def) {
+  const DagInit *OutOperands = Def.getValueAsDag("OutOperandList");
+  const DagInit *InOperands = Def.getValueAsDag("InOperandList");
+  if (OutOperands->getNumArgs() > 0)
+    PrintFatalError(&Def, ".insn directive may not have output operands");
+  if (InOperands->getNumArgs() == 0)
+    PrintFatalError(&Def, ".insn directive missing encoding operand");
+
+  InsnMatchEntry Entry;
+  Entry.Format = getFormatName(Def).str();
+  Entry.Opcode = ("SystemZ::" + Def.getName()).str();
+
+  for (unsigned I = 0; I < InOperands->getNumArgs(); ++I)
+    Entry.OperandKinds.push_back(
+        getMatchClassKind(Def, InOperands->getArg(I), I).str());
+
+  return Entry;
+}
+
+static void emitInsnDirectiveMatchTable(const RecordKeeper &RK,
+                                        raw_ostream &OS) {
+  // This will hold all .insn directive definitions (~100 plus margin).
+  SmallVector<InsnMatchEntry, 128> Entries;
+  // All .insn directive instructions inherit from InsnDirectiveBase.
+  for (const Record *Def : RK.getAllDerivedDefinitions("InsnDirectiveBase")) {
+    Entries.push_back(buildInsnMatchEntry(*Def));
+  }
+
+  llvm::sort(Entries, [](const InsnMatchEntry &LHS, const InsnMatchEntry &RHS) {
+    return std::tie(LHS.Format, LHS.Opcode) < std::tie(RHS.Format, RHS.Opcode);
+  });
+
+  OS << "/* Format, Opcode, NumOperands, OperandKinds */\n";
+  for (const InsnMatchEntry &Entry : Entries) {
+    OS << "  {\"" << Entry.Format << "\", " << Entry.Opcode << ", "
+       << Entry.OperandKinds.size() << ", {";
+    for (unsigned I = 0; I < Entry.OperandKinds.size(); ++I) {
+      if (I != 0)
+        OS << ", ";
+      OS << Entry.OperandKinds[I];
+    }
+    OS << "}},\n";
+  }
+}
+} // namespace
+
+static TableGen::Emitter::Opt X("gen-insn-directive-match-table",
+                                emitInsnDirectiveMatchTable,
+                                "Generate SystemZ .insn match table.");

>From 4bad524696b56ddcd71098228d94cbfb1976431b Mon Sep 17 00:00:00 2001
From: Dominik Steenken <dost at de.ibm.com>
Date: Tue, 8 Sep 2026 09:46:15 +0200
Subject: [PATCH 3/4] [SystemZ] Improve .insn directive test coverage

This commit adds tests for four targets previously uncovered:

1. X8Imm lower bound: add a negative test for .insn si with -129, which
   is below the X8Imm union range [-128..255]. The existing test only
   covered the upper bound (256) and the sign extension case (-1).

2. X32Imm lower bound: add a negative test for .insn ril_a with
   -2147483649, which is below the X32Imm union range
   [-2147483648..4294967295]. The existing test only covered the upper
   bound (4294967295).

3. BDL address displacement: add a negative test for .insn rsl_a with
   a 12-bit displacement value out of range (4096). The rsl_a format
   uses parseBDLAddr64, a code path added in the .insn expansion but
   previously untested for error handling.

4. TableGen backend: add a lit test for the new
   SystemZInsnDirectiveEmitter (-gen-insn-directive-match-table).
   Checks cover representative entries across format families,
   X-imm MCK assignments (X8Imm, X16Imm, X32Imm), BDL address
   operands, PC-relative immediates, and the (format, opcode) sort
   order guarantee.

assisted-by: IBM Bob
---
 llvm/test/MC/SystemZ/directive-insn-bad.s     | 16 ++++++
 .../TableGen/SystemZInsnDirectiveEmitter.td   | 56 +++++++++++++++++++
 2 files changed, 72 insertions(+)
 create mode 100644 llvm/test/TableGen/SystemZInsnDirectiveEmitter.td

diff --git a/llvm/test/MC/SystemZ/directive-insn-bad.s b/llvm/test/MC/SystemZ/directive-insn-bad.s
index 63a4212501378..b839d577b1236 100644
--- a/llvm/test/MC/SystemZ/directive-insn-bad.s
+++ b/llvm/test/MC/SystemZ/directive-insn-bad.s
@@ -95,3 +95,19 @@
 # CHECK: error: unexpected operand type
 # CHECK: .insn sil,0xe56000000000,160(%r15),-32769
         .insn sil,0xe56000000000,160(%r15),-32769  # sil expects unsigned 16-bit, value too negative
+
+# Test X-imm (union signed/unsigned) lower bound validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn si,0x91000000,160(%r15),-129
+        .insn si,0x91000000,160(%r15),-129         # X8Imm lower bound (min -128)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn ril_a,0xc20500000000,%r1,-2147483649
+        .insn ril_a,0xc20500000000,%r1,-2147483649 # X32Imm lower bound (min -2147483648)
+
+# Test BD-length address range validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn rsl_a,0xeb00000000c0,4096(2,%r2)
+        .insn rsl_a,0xeb00000000c0,4096(2,%r2)     # 12-bit displacement in BDL address, value too large (max 4095)
diff --git a/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td b/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td
new file mode 100644
index 0000000000000..90f8f49900a1b
--- /dev/null
+++ b/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td
@@ -0,0 +1,56 @@
+// RUN: llvm-tblgen -gen-insn-directive-match-table %p/../../lib/Target/SystemZ/SystemZ.td \
+// RUN:   -I %p/../../lib/Target/SystemZ -I %p/../../include | FileCheck %s
+
+// Verify that the SystemZ .insn directive match table is generated correctly.
+// Checks cover:
+//   - Representative entries from several format families to confirm format
+//     name, opcode symbol, operand count, and MCK kinds.
+//   - X-imm (union signed/unsigned) operands are mapped to the right MCK.
+//   - Entries are sorted by (format, opcode): verified with adjacent pairs.
+// Checks must appear in output order (FileCheck is sequential).
+
+// Single-operand format.
+// CHECK: {"e", SystemZ::InsnE, 1, {MCK_U16Imm}},
+
+// I format: opcode + 1 immediate.
+// CHECK: {"i", SystemZ::InsnI, 2, {MCK_U16Imm, MCK_U8Imm}},
+
+// MII: opcode + mask + two PC-relative immediates of different widths.
+// CHECK: {"mii", SystemZ::InsnMII, 4, {MCK_U48Imm, MCK_U4Imm, MCK_PCRel12, MCK_PCRel24}},
+
+// RI alias uses signed 16-bit immediate; RI-a subformat uses the union X16Imm.
+// CHECK: {"ri", SystemZ::InsnRI, 3, {MCK_U32Imm, MCK_AnyReg, MCK_S16Imm}},
+// CHECK: {"ri_a", SystemZ::InsnRIa, 3, {MCK_U32Imm, MCK_AnyReg, MCK_X16Imm}},
+
+// RIE-c uses X8Imm (union of signed/unsigned 8-bit) for its immediate field.
+// CHECK: {"rie_c", SystemZ::InsnRIEc, 5, {MCK_U48Imm, MCK_AnyReg, MCK_X8Imm, MCK_U4Imm, MCK_PCRel16}},
+
+// RIL-a uses X32Imm (union of signed/unsigned 32-bit).
+// CHECK: {"ril_a", SystemZ::InsnRILa, 3, {MCK_U48Imm, MCK_AnyReg, MCK_X32Imm}},
+
+// RSL-a uses a BDL address with 4-bit length.
+// CHECK: {"rsl_a", SystemZ::InsnRSLa, 2, {MCK_U48Imm, MCK_BDLAddr64Disp12Len4}},
+
+// RSL-b uses a BDL address with 8-bit length.
+// CHECK: {"rsl_b", SystemZ::InsnRSLb, 4, {MCK_U48Imm, MCK_AnyReg, MCK_BDLAddr64Disp12Len8, MCK_U4Imm}},
+
+// SI, SIL and SIY use X-imm for the immediate field.
+// CHECK: {"si", SystemZ::InsnSI, 3, {MCK_U32Imm, MCK_BDAddr64Disp12, MCK_X8Imm}},
+// CHECK: {"sil", SystemZ::InsnSIL, 3, {MCK_U48Imm, MCK_BDAddr64Disp12, MCK_X16Imm}},
+// CHECK: {"siy", SystemZ::InsnSIY, 3, {MCK_U48Imm, MCK_BDAddr64Disp20, MCK_X8Imm}},
+
+// SMI (branch-prediction): opcode + mask + PC-relative 16 + BD address.
+// CHECK: {"smi", SystemZ::InsnSMI, 4, {MCK_U48Imm, MCK_U4Imm, MCK_PCRel16, MCK_BDAddr64Disp12}},
+
+// SS-a uses an 8-bit-length BDL for the first operand.
+// CHECK: {"ss_a", SystemZ::InsnSSa, 3, {MCK_U48Imm, MCK_BDLAddr64Disp12Len8, MCK_BDAddr64Disp12}},
+
+// VRI-a uses X16Imm.
+// CHECK: {"vri_a", SystemZ::InsnVRIa, 4, {MCK_U48Imm, MCK_VR128, MCK_X16Imm, MCK_U4Imm}},
+
+// Verify format-then-opcode sort order: vrr_j comes before vrr_k.
+// CHECK: {"vrr_j",
+// CHECK: {"vrr_k",
+
+// VRS-d (z14): opcode + vector + BD address + GP register.
+// CHECK: {"vrs_d", SystemZ::InsnVRSd, 4, {MCK_U48Imm, MCK_VR128, MCK_BDAddr64Disp12, MCK_AnyReg}},

>From 7522bdf968b711c9314e710baabe83c0ca52fe96 Mon Sep 17 00:00:00 2001
From: Dominik Steenken <dost at de.ibm.com>
Date: Wed, 9 Sep 2026 11:15:34 +0200
Subject: [PATCH 4/4] Various smaller improvements

- Remove match table ordering tiebreak
  The tiebreak covered cases that weren't going to occur (equally-named
  formats) and only worked by coincidence anyway since the ordering is by
  string on the emitter side and by an enum on the parser side.
- Various test improvements
- Various Comment improvements
- Make operand parsing slightly less brittle
- cmake targets in alphabetical order
- minor fixes, typos, etc.
---
 .../SystemZ/AsmParser/SystemZAsmParser.cpp    |  4 +---
 llvm/lib/Target/SystemZ/SystemZInstrInfo.td   | 12 +++++++---
 llvm/test/MC/SystemZ/directive-insn-bad.s     | 22 +++++++++++++++----
 llvm/test/MC/SystemZ/directive-insn.s         | 17 +++++++-------
 .../TableGen/SystemZInsnDirectiveEmitter.td   |  2 +-
 llvm/utils/TableGen/CMakeLists.txt            |  2 +-
 .../TableGen/SystemZInsnDirectiveEmitter.cpp  | 18 +++++++--------
 7 files changed, 48 insertions(+), 29 deletions(-)

diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
index f0d842ac93dc8..bb0a409f2e71e 100644
--- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
+++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
@@ -660,9 +660,7 @@ struct CompareInsn {
     return LHS < RHS.Format;
   }
   bool operator() (const InsnMatchEntry &LHS, const InsnMatchEntry &RHS) {
-    if (LHS.Format != RHS.Format)
-      return LHS.Format < RHS.Format;
-    return LHS.Opcode < RHS.Opcode;
+    return LHS.Format < RHS.Format;
   }
 };
 
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
index 459d574b6cfdd..a2886e90ebc8e 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
@@ -2487,6 +2487,7 @@ def InsnRRE : InstRRE<0, (outs), (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2),
 
   let Inst{31-16} = enc{31-16};
 }
+// Alias for rrf-a. Kept for backwards compatibility.
 def InsnRRF : InstRRFa<0, (outs),
                        (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R2, AnyReg:$R3,
                            imm32zx4:$M4),
@@ -2579,7 +2580,7 @@ def InsnRSb : InstRSb<0, (outs),
 
   let Inst{31-24} = enc{31-24};
 }
-// RRSE - legacy operand order preserved
+// RSE - legacy operand order preserved
 def InsnRSE : InstRSEa<6, (outs),
                        (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3,
                            (bdaddr12only $B2, $D2):$BD2),
@@ -2593,7 +2594,7 @@ def InsnRSE : InstRSEa<6, (outs),
 // RSI - legacy operand order preserved
 def InsnRSI
     : InstRSI<0, (outs),
-              (ins imm64zx48:$enc, AnyReg:$R1, AnyReg:$R3, brtarget16:$RI2),
+              (ins imm64zx32:$enc, AnyReg:$R1, AnyReg:$R3, brtarget16:$RI2),
               ".insn rsi,$enc,$R1,$R3,$RI2", []>,
       InsnDirectiveBase {
   bits<32> enc;
@@ -2647,6 +2648,7 @@ def InsnRSYb : InstRSYb<0, (outs),
   let Inst{47-40} = enc{47-40};
   let Inst{7-0} = enc{7-0};
 }
+// Alias for rx-a. Kept for backwards compatibility.
 def InsnRX : InstRXa<0, (outs),
                      (ins imm64zx32:$enc, AnyReg:$R1,
                          (bdxaddr12only $B2, $D2, $X2):$XBD2),
@@ -2691,7 +2693,7 @@ def InsnRXF : InstRXF<0, (outs),
   let Inst{47-40} = enc{47-40};
   let Inst{7-0} = enc{7-0};
 }
-// RXY - legacy operand order preserved
+
 def InsnRXY : InstRXYa<0, (outs),
                        (ins imm64zx48:$enc, AnyReg:$R1,
                            (bdxaddr20only $B2, $D2, $X2):$XBD2),
@@ -2719,6 +2721,7 @@ def InsnRXYb : InstRXYb<0, (outs),
   let Inst{47-40} = enc{47-40};
   let Inst{7-0} = enc{7-0};
 }
+// There is no InstRXYc - it is identical to InstRXYa.
 def InsnRXYc : InstRXYa<0, (outs),
                         (ins imm64zx48:$enc, AnyReg:$R1,
                             (bdxaddr20only $B2, $D2, $X2):$XBD2),
@@ -2767,6 +2770,7 @@ def InsnSMI : InstSMI<0, (outs),
   bits<48> enc;
   let Inst{47-40} = enc{47-40};
 }
+// Alias for ss-. Kept for backwards compatibility.
 def InsnSS : InstSSd<0, (outs),
                      (ins imm64zx48:$enc, (bdraddr12only $B1, $D1, $R1):$RBD1,
                          (bdaddr12only $B2, $D2):$BD2, AnyReg:$R3),
@@ -2844,6 +2848,7 @@ def InsnSSF : InstSSF<0, (outs),
   let Inst{47-40} = enc{47-40};
   let Inst{35-32} = enc{35-32};
 }
+// Alias for vri-e. Kept for backwards compatibility.
 def InsnVRI : InstVRIe<0, (outs),
                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, imm32zx12:$I3,
                            imm32zx4:$M4, imm32zx4:$M5),
@@ -2961,6 +2966,7 @@ def InsnVRIl
   let Inst{47-40} = enc{47-40};
   let Inst{7-0} = enc{7-0};
 }
+// Alias for vrr-c. Kept for backwards compatibility.
 def InsnVRR : InstVRRc<0, (outs),
                        (ins imm64zx48:$enc, VR128:$V1, VR128:$V2, VR128:$V3,
                            imm32zx4:$M4, imm32zx4:$M5, imm32zx4:$M6),
diff --git a/llvm/test/MC/SystemZ/directive-insn-bad.s b/llvm/test/MC/SystemZ/directive-insn-bad.s
index b839d577b1236..f7a169495c821 100644
--- a/llvm/test/MC/SystemZ/directive-insn-bad.s
+++ b/llvm/test/MC/SystemZ/directive-insn-bad.s
@@ -92,20 +92,34 @@
 # CHECK: .insn rilu,0xc20b00000000,%r2,-1
         .insn rilu,0xc20b00000000,%r2,-1           # rilu expects unsigned 32-bit, negative value rejected
 
-# CHECK: error: unexpected operand type
-# CHECK: .insn sil,0xe56000000000,160(%r15),-32769
-        .insn sil,0xe56000000000,160(%r15),-32769  # sil expects unsigned 16-bit, value too negative
-
 # Test X-imm (union signed/unsigned) lower bound validation
 
 # CHECK: error: unexpected operand type
 # CHECK: .insn si,0x91000000,160(%r15),-129
         .insn si,0x91000000,160(%r15),-129         # X8Imm lower bound (min -128)
 
+# CHECK: error: unexpected operand type
+# CHECK: .insn sil,0xe56000000000,160(%r15),-32769
+        .insn sil,0xe56000000000,160(%r15),-32769  # X16Imm lower bound
+
 # CHECK: error: unexpected operand type
 # CHECK: .insn ril_a,0xc20500000000,%r1,-2147483649
         .insn ril_a,0xc20500000000,%r1,-2147483649 # X32Imm lower bound (min -2147483648)
 
+# Test X-imm (union signed/unsigned) upper bound validation
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn si,0x91000000,160(%r15),256
+        .insn si,0x91000000,160(%r15),256          # X8Imm upper bound (max 255)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn sil,0xe56000000000,160(%r15),65536
+        .insn sil,0xe56000000000,160(%r15),65536   # X16Imm upper bound (max 65535)
+
+# CHECK: error: unexpected operand type
+# CHECK: .insn ril_a,0xc20500000000,%r1,4294967296
+        .insn ril_a,0xc20500000000,%r1,4294967296  # X32Imm upper bound (max 4294967295)
+
 # Test BD-length address range validation
 
 # CHECK: error: unexpected operand type
diff --git a/llvm/test/MC/SystemZ/directive-insn.s b/llvm/test/MC/SystemZ/directive-insn.s
index 980578e561e78..caa8899b3e7ab 100644
--- a/llvm/test/MC/SystemZ/directive-insn.s
+++ b/llvm/test/MC/SystemZ/directive-insn.s
@@ -164,10 +164,13 @@ label.rsi:
 #CHECK: c2 15 ff ff ff ff slfi %r1, 4294967295
       .insn ril_a,0xc20500000000,%r1,4294967295
 
-#CHECK: c0 15 ff ff ff fc    	brasl	%r1, 0xf8
+#CHECK: c2 15 00 fa ca de    	slfi	%r1, 16435934
+      .insn ril_a,0xc20500000000,%r1,(0x00fa0000 | 0xcade)
+
+#CHECK: c0 15 ff ff ff fc    	brasl	%r1, 0xfe
       .insn ril_b,0xc00500000000,%r1,-8
 
-#CHECK: c0 04 ff ff ff fc    	jgnop	0xfe
+#CHECK: c0 04 ff ff ff fc    	jgnop	0x104
       .insn ril_c,0xc00400000000,0,-8
 
 #CHECK: b3 3e 10 23  	madr	%f1, %f2, %f3
@@ -189,7 +192,7 @@ label.rsi:
       .insn rrf_d,0xb3e30000,%r2,%f3,1
 
 #CHECK: b3 d7 12 34  	fidtr	%f3, 1, %f4, 2
-      .insn rrf_e,0xb3d70000,%r3,%f4,1,2
+      .insn rrf_e,0xb3d70000,%f3,%f4,1,2
 
 #CHECK: 86 12 34 56  	bxh	%r1, %r2, 1110(%r3)
       .insn rs_a,0x86000000,%r1,1110(%r3),%r2
@@ -233,9 +236,7 @@ label.rsi:
 #CHECK: e9 12 34 56 78 90      pka 1110(%r3), 2192(19,%r7)
       .insn ss_f,0xe90000000000,1110(%r3),2192(19,%r7)
 
-#CHECK: c0 04 00 00 00 03      jgnop 0x17a
-      .insn ril_c,0xc00400000000,0,label.autogen_ril_c
-label.autogen_ril_c:
+#CHECK: c0 04 00 00 00 03      jgnop 0x180
+      .insn ril_c,0xc00400000000,0,label.ril_c
+label.ril_c:
 
-#CHECK: e3 12 34 56 78 16      llgf %r1, 492630(%r2,%r3)
-      .insn rxy_a,0xe30000000016,%r1,492630(%r2,%r3)
diff --git a/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td b/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td
index 90f8f49900a1b..42cb56fa5f2aa 100644
--- a/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td
+++ b/llvm/test/TableGen/SystemZInsnDirectiveEmitter.td
@@ -6,7 +6,7 @@
 //   - Representative entries from several format families to confirm format
 //     name, opcode symbol, operand count, and MCK kinds.
 //   - X-imm (union signed/unsigned) operands are mapped to the right MCK.
-//   - Entries are sorted by (format, opcode): verified with adjacent pairs.
+//   - Entries are sorted by format.
 // Checks must appear in output order (FileCheck is sequential).
 
 // Single-operand format.
diff --git a/llvm/utils/TableGen/CMakeLists.txt b/llvm/utils/TableGen/CMakeLists.txt
index 4f6957b93275b..23dcd6fcafad6 100644
--- a/llvm/utils/TableGen/CMakeLists.txt
+++ b/llvm/utils/TableGen/CMakeLists.txt
@@ -66,6 +66,7 @@ add_tablegen(llvm-tblgen LLVM
   SDNodeInfoEmitter.cpp
   SearchableTableEmitter.cpp
   SubtargetEmitter.cpp
+  SystemZInsnDirectiveEmitter.cpp
   WebAssemblyDisassemblerEmitter.cpp
   X86InstrMappingEmitter.cpp
   X86DisassemblerTables.cpp
@@ -73,7 +74,6 @@ add_tablegen(llvm-tblgen LLVM
   X86MnemonicTables.cpp
   X86ModRMFilters.cpp
   X86RecognizableInstr.cpp
-  SystemZInsnDirectiveEmitter.cpp
   $<TARGET_OBJECTS:obj.LLVMTableGenBasic>
   $<TARGET_OBJECTS:obj.LLVMTableGenCommon>
 
diff --git a/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp b/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp
index 25eda39b3d44e..417710f783779 100644
--- a/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp
+++ b/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp
@@ -68,12 +68,11 @@ static StringRef getMatchClassKind(const Record &Def, const Init *Arg,
       {"bdladdr12onlylen8", "MCK_BDLAddr64Disp12Len8"},
       {"bdraddr12only", "MCK_BDRAddr64Disp12"}};
 
-  std::string ArgTextStorage = Arg->getAsString();
-  StringRef ArgText(ArgTextStorage);
-  if (!ArgText.empty() && ArgText.front() == '(') {
-    ArgText = ArgText.drop_front();
-    ArgText = ArgText.take_while([](char C) { return C != ' '; });
-  }
+  StringRef ArgText;
+  if (const DefInit *DefOp = dyn_cast<DefInit>(Arg))
+    ArgText = DefOp->getDef()->getName();
+  if (const DagInit *DagOp = dyn_cast<DagInit>(Arg))
+    ArgText = DagOp->getOperatorAsDef(Def.getLoc())->getName();
 
   // Check registered mappings
   auto It = KindMap.find(ArgText);
@@ -105,15 +104,16 @@ static InsnMatchEntry buildInsnMatchEntry(const Record &Def) {
 
 static void emitInsnDirectiveMatchTable(const RecordKeeper &RK,
                                         raw_ostream &OS) {
+  emitSourceFileHeader("Match Table for SystemZ .insn directive operand types",
+                       OS);
   // This will hold all .insn directive definitions (~100 plus margin).
   SmallVector<InsnMatchEntry, 128> Entries;
   // All .insn directive instructions inherit from InsnDirectiveBase.
-  for (const Record *Def : RK.getAllDerivedDefinitions("InsnDirectiveBase")) {
+  for (const Record *Def : RK.getAllDerivedDefinitions("InsnDirectiveBase"))
     Entries.push_back(buildInsnMatchEntry(*Def));
-  }
 
   llvm::sort(Entries, [](const InsnMatchEntry &LHS, const InsnMatchEntry &RHS) {
-    return std::tie(LHS.Format, LHS.Opcode) < std::tie(RHS.Format, RHS.Opcode);
+    return LHS.Format < RHS.Format;
   });
 
   OS << "/* Format, Opcode, NumOperands, OperandKinds */\n";



More information about the llvm-commits mailing list