[llvm] [SystemZ] Expand and Automate `.insn` directive support (PR #152667)

Dominik Steenken via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 27 03:24:13 PDT 2026


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

>From bf3102e9f425efff2bfd750ef840484485e7543e 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/2] [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    |  15 +
 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, 1467 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 27ef8ff0b6515..bb0f6951a7fca 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 35a923d070e3e..0635f88830293 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
@@ -2228,42 +2228,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),
@@ -2272,13 +2370,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", []>;
@@ -2286,28 +2412,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),
@@ -2316,19 +2494,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 22dcc4a6d7cd3..aaa69b2f38743 100644
--- a/llvm/lib/Target/SystemZ/SystemZOperands.td
+++ b/llvm/lib/Target/SystemZ/SystemZOperands.td
@@ -307,11 +307,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">;
 
 //===----------------------------------------------------------------------===//
@@ -371,6 +374,10 @@ defm imm32zx8 : Immediate<i32, [{
   return N->getAPIntValue().isIntN(8);
 }], UIMM8, "U8Imm">;
 
+defm imm32xx8 : Immediate<i32, [{
+  return false;
+}], UIMM8, "X8Imm">;
+
 defm imm32zx8trunc : Immediate<i32, [{}], UIMM8, "U8Imm">;
 
 defm imm32zx12 : Immediate<i32, [{
@@ -389,6 +396,10 @@ defm imm32zx16 : Immediate<i32, [{
   return N->getAPIntValue().isIntN(16);
 }], UIMM16, "U16Imm">;
 
+defm imm32xx16 : Immediate<i32, [{
+  return false;
+}], UIMM16, "X16Imm">;
+
 defm imm32sx16trunc : Immediate<i32, [{}], SIMM16, "S16Imm">;
 defm imm32zx16trunc : Immediate<i32, [{}], UIMM16, "U16Imm">;
 
@@ -515,6 +526,10 @@ defm imm64zx32 : Immediate<i64, [{
   return N->getAPIntValue().isIntN(32);
 }], UIMM32, "U32Imm">;
 
+defm imm64xx32 : Immediate<i64, [{
+  return false;
+}], UIMM32, "X32Imm">;
+
 defm imm64zx32n : Immediate<i64, [{
   return (-N->getAPIntValue()).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 4fb8e9009f89c33d4476b7d7c250bdea97aa7507 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/2] 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

Note that in several formats, the instructions using that format
do not agree in which order certain operands are to be specified
in the assembly.
Wherever this does not break backwards compatibility, this commit
orders the operands by their *index order*, e.g. R1 > I2 > R3 > RBD4.
---
 .../SystemZ/AsmParser/SystemZAsmParser.cpp    |  329 +----
 llvm/lib/Target/SystemZ/CMakeLists.txt        |    1 +
 .../lib/Target/SystemZ/SystemZInstrFormats.td |  661 +--------
 llvm/lib/Target/SystemZ/SystemZInstrInfo.td   | 1281 +++++++++++------
 llvm/lib/Target/SystemZ/SystemZOperands.td    |    3 +
 llvm/lib/Target/SystemZ/SystemZScheduleZ13.td |    9 -
 llvm/lib/Target/SystemZ/SystemZScheduleZ14.td |    9 -
 llvm/lib/Target/SystemZ/SystemZScheduleZ15.td |    9 -
 llvm/lib/Target/SystemZ/SystemZScheduleZ16.td |    9 -
 llvm/lib/Target/SystemZ/SystemZScheduleZ17.td |    9 -
 .../lib/Target/SystemZ/SystemZScheduleZ196.td |    9 -
 .../Target/SystemZ/SystemZScheduleZEC12.td    |    9 -
 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  |  132 ++
 17 files changed, 1123 insertions(+), 1457 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 bb0f6951a7fca..07f2b4c84a3b2 100644
--- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
+++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp
@@ -666,333 +666,8 @@ struct CompareInsn {
 
 // 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) {
diff --git a/llvm/lib/Target/SystemZ/CMakeLists.txt b/llvm/lib/Target/SystemZ/CMakeLists.txt
index 6d94a755322df..26a90ada105d3 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..608c2a3450daa 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.
+class InsnDirectiveBase {
+  bit isCodeGenOnly = 1;
+  bit hasSideEffects = 1;
+  bit hasNoSchedulingInfo = 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 0635f88830293..6c7869a87df8a 100644
--- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
+++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.td
@@ -2226,420 +2226,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", []>,
+               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/lib/Target/SystemZ/SystemZOperands.td b/llvm/lib/Target/SystemZ/SystemZOperands.td
index aaa69b2f38743..63f8289d74a1d 100644
--- a/llvm/lib/Target/SystemZ/SystemZOperands.td
+++ b/llvm/lib/Target/SystemZ/SystemZOperands.td
@@ -374,6 +374,7 @@ defm imm32zx8 : Immediate<i32, [{
   return N->getAPIntValue().isIntN(8);
 }], UIMM8, "U8Imm">;
 
+// .insn-directive-only operand class. Should never match in Codegen.
 defm imm32xx8 : Immediate<i32, [{
   return false;
 }], UIMM8, "X8Imm">;
@@ -396,6 +397,7 @@ defm imm32zx16 : Immediate<i32, [{
   return N->getAPIntValue().isIntN(16);
 }], UIMM16, "U16Imm">;
 
+// .insn-directive-only operand class. Should never match in Codegen.
 defm imm32xx16 : Immediate<i32, [{
   return false;
 }], UIMM16, "X16Imm">;
@@ -526,6 +528,7 @@ defm imm64zx32 : Immediate<i64, [{
   return N->getAPIntValue().isIntN(32);
 }], UIMM32, "U32Imm">;
 
+// .insn-directive-only operand class. Should never match in Codegen.
 defm imm64xx32 : Immediate<i64, [{
   return false;
 }], UIMM32, "X32Imm">;
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td
index afe8dec402548..c7ded4fe8caaf 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ13.td
@@ -757,15 +757,6 @@ def : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "CMPSC$")>;
 // Execute
 def : InstRW<[WLat1, FXb, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td
index dbbbcbee1c146..447404b495344 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ14.td
@@ -777,15 +777,6 @@ def : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "CMPSC$")>;
 // Execute
 def : InstRW<[WLat1, FXb, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td
index 618e6dfa823d6..a1049fce3a40a 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ15.td
@@ -795,15 +795,6 @@ def : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "DFLTCC$")>;
 // Execute
 def : InstRW<[WLat1, FXb, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td
index 0752b1c990091..da0314d3749bd 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ16.td
@@ -796,15 +796,6 @@ def : InstRW<[WLat30, WLat30, MCD], (instregex "NNPA$")>;
 // Execute
 def : InstRW<[WLat1, FXb, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td
index f8677d1191ccf..8748be0abd409 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ17.td
@@ -811,15 +811,6 @@ def : InstRW<[WLat30, WLat30, MCD], (instregex "NNPA$")>;
 // Execute
 def : InstRW<[WLat1, FXb, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZ196.td b/llvm/lib/Target/SystemZ/SystemZScheduleZ196.td
index 26433b97484da..b67f4600800b0 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZ196.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZ196.td
@@ -689,15 +689,6 @@ def : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "CMPSC$")>;
 // Execute
 def : InstRW<[LSU, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/SystemZ/SystemZScheduleZEC12.td b/llvm/lib/Target/SystemZ/SystemZScheduleZEC12.td
index 193a793f17367..1280b12898247 100644
--- a/llvm/lib/Target/SystemZ/SystemZScheduleZEC12.td
+++ b/llvm/lib/Target/SystemZ/SystemZScheduleZEC12.td
@@ -727,15 +727,6 @@ def : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "CMPSC$")>;
 // Execute
 def : InstRW<[LSU, GroupAlone], (instregex "EX(RL)?$")>;
 
-//===----------------------------------------------------------------------===//
-// .insn directive instructions
-//===----------------------------------------------------------------------===//
-
-// An "empty" sched-class will be assigned instead of the "invalid sched-class".
-// getNumDecoderSlots() will then return 1 instead of 0.
-def : InstRW<[], (instregex "Insn.*")>;
-
-
 // ----------------------------- Floating point ----------------------------- //
 
 //===----------------------------------------------------------------------===//
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..685195cb7594d
--- /dev/null
+++ b/llvm/utils/TableGen/SystemZInsnDirectiveEmitter.cpp
@@ -0,0 +1,132 @@
+//===- 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_X8Imm"},
+      {"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_BDXAddr64Disp12"}};
+
+  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 *InOperands = Def.getValueAsDag("InOperandList");
+  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 LHS.Format < RHS.Format;
+  });
+
+  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.");



More information about the llvm-commits mailing list