public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/5] x86: adjustments to struct instr_info (and more)
@ 2022-01-14 13:51 Jan Beulich
  2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:51 UTC (permalink / raw)
  To: Binutils

Some of this I was meaning to do for a long time, and now it (and
further aspects) have been prompted by the thread-safety rework

1: constify disassembler static data
2: fold variables in memory operand index handling
3: drop most Intel syntax register name arrays
4: drop index16 field
5: adjust struct instr_info field types

Jan


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 1/5] x86: constify disassembler static data
  2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
@ 2022-01-14 13:52 ` Jan Beulich
  2022-01-14 13:52 ` [PATCH 2/5] x86: fold variables in memory operand index handling Jan Beulich
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:52 UTC (permalink / raw)
  To: Binutils

Now that the code is intended to be largely thread-safe, we'd better not
have any writable static objects.

--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -219,22 +219,22 @@ struct instr_info
   vex;
   unsigned char need_vex;
 
-  const char **names64;
-  const char **names32;
-  const char **names16;
-  const char **names8;
-  const char **names8rex;
-  const char **names_seg;
+  const char *const *names64;
+  const char *const *names32;
+  const char *const *names16;
+  const char *const *names8;
+  const char *const *names8rex;
+  const char *const *names_seg;
   const char *index64;
   const char *index32;
-  const char **index16;
-  const char **names_bnd;
-  const char **names_mm;
-  const char **names_xmm;
-  const char **names_ymm;
-  const char **names_zmm;
-  const char **names_tmm;
-  const char **names_mask;
+  const char *const *index16;
+  const char *const *names_bnd;
+  const char *const *names_mm;
+  const char *const *names_xmm;
+  const char *const *names_ymm;
+  const char *const *names_zmm;
+  const char *const *names_tmm;
+  const char *const *names_mask;
 
   /* Remember if the current op is a jump instruction.  */
   bool op_is_jump;
@@ -2423,80 +2423,80 @@ struct op
    need to update onebyte_has_modrm or twobyte_has_modrm.  */
 #define MODRM_CHECK  if (!ins->need_modrm) abort ()
 
-static const char *intel_names64[] = {
+static const char *const intel_names64[] = {
   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
 };
-static const char *intel_names32[] = {
+static const char *const intel_names32[] = {
   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
   "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
 };
-static const char *intel_names16[] = {
+static const char *const intel_names16[] = {
   "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
   "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
 };
-static const char *intel_names8[] = {
+static const char *const intel_names8[] = {
   "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
 };
-static const char *intel_names8rex[] = {
+static const char *const intel_names8rex[] = {
   "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
   "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
 };
-static const char *intel_names_seg[] = {
+static const char *const intel_names_seg[] = {
   "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
 };
-static const char *intel_index64 = "riz";
-static const char *intel_index32 = "eiz";
-static const char *intel_index16[] = {
+static const char intel_index64[] = "riz";
+static const char intel_index32[] = "eiz";
+static const char *const intel_index16[] = {
   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
 };
 
-static const char *att_names64[] = {
+static const char *const att_names64[] = {
   "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi",
   "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
 };
-static const char *att_names32[] = {
+static const char *const att_names32[] = {
   "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi",
   "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d"
 };
-static const char *att_names16[] = {
+static const char *const att_names16[] = {
   "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di",
   "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w"
 };
-static const char *att_names8[] = {
+static const char *const att_names8[] = {
   "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh",
 };
-static const char *att_names8rex[] = {
+static const char *const att_names8rex[] = {
   "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil",
   "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b"
 };
-static const char *att_names_seg[] = {
+static const char *const att_names_seg[] = {
   "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?",
 };
-static const char *att_index64 = "%riz";
-static const char *att_index32 = "%eiz";
-static const char *att_index16[] = {
+static const char att_index64[] = "%riz";
+static const char att_index32[] = "%eiz";
+static const char *const att_index16[] = {
   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
 };
 
-static const char *intel_names_mm[] = {
+static const char *const intel_names_mm[] = {
   "mm0", "mm1", "mm2", "mm3",
   "mm4", "mm5", "mm6", "mm7"
 };
-static const char *att_names_mm[] = {
+static const char *const att_names_mm[] = {
   "%mm0", "%mm1", "%mm2", "%mm3",
   "%mm4", "%mm5", "%mm6", "%mm7"
 };
 
-static const char *intel_names_bnd[] = {
+static const char *const intel_names_bnd[] = {
   "bnd0", "bnd1", "bnd2", "bnd3"
 };
 
-static const char *att_names_bnd[] = {
+static const char *const att_names_bnd[] = {
   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
 };
 
-static const char *intel_names_xmm[] = {
+static const char *const intel_names_xmm[] = {
   "xmm0", "xmm1", "xmm2", "xmm3",
   "xmm4", "xmm5", "xmm6", "xmm7",
   "xmm8", "xmm9", "xmm10", "xmm11",
@@ -2506,7 +2506,7 @@ static const char *intel_names_xmm[] = {
   "xmm24", "xmm25", "xmm26", "xmm27",
   "xmm28", "xmm29", "xmm30", "xmm31"
 };
-static const char *att_names_xmm[] = {
+static const char *const att_names_xmm[] = {
   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
   "%xmm8", "%xmm9", "%xmm10", "%xmm11",
@@ -2517,7 +2517,7 @@ static const char *att_names_xmm[] = {
   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
 };
 
-static const char *intel_names_ymm[] = {
+static const char *const intel_names_ymm[] = {
   "ymm0", "ymm1", "ymm2", "ymm3",
   "ymm4", "ymm5", "ymm6", "ymm7",
   "ymm8", "ymm9", "ymm10", "ymm11",
@@ -2527,7 +2527,7 @@ static const char *intel_names_ymm[] = {
   "ymm24", "ymm25", "ymm26", "ymm27",
   "ymm28", "ymm29", "ymm30", "ymm31"
 };
-static const char *att_names_ymm[] = {
+static const char *const att_names_ymm[] = {
   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
   "%ymm8", "%ymm9", "%ymm10", "%ymm11",
@@ -2538,7 +2538,7 @@ static const char *att_names_ymm[] = {
   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
 };
 
-static const char *intel_names_zmm[] = {
+static const char *const intel_names_zmm[] = {
   "zmm0", "zmm1", "zmm2", "zmm3",
   "zmm4", "zmm5", "zmm6", "zmm7",
   "zmm8", "zmm9", "zmm10", "zmm11",
@@ -2548,7 +2548,7 @@ static const char *intel_names_zmm[] = {
   "zmm24", "zmm25", "zmm26", "zmm27",
   "zmm28", "zmm29", "zmm30", "zmm31"
 };
-static const char *att_names_zmm[] = {
+static const char *const att_names_zmm[] = {
   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
   "%zmm8", "%zmm9", "%zmm10", "%zmm11",
@@ -2559,19 +2559,19 @@ static const char *att_names_zmm[] = {
   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
 };
 
-static const char *intel_names_tmm[] = {
+static const char *const intel_names_tmm[] = {
   "tmm0", "tmm1", "tmm2", "tmm3",
   "tmm4", "tmm5", "tmm6", "tmm7"
 };
-static const char *att_names_tmm[] = {
+static const char *const att_names_tmm[] = {
   "%tmm0", "%tmm1", "%tmm2", "%tmm3",
   "%tmm4", "%tmm5", "%tmm6", "%tmm7"
 };
 
-static const char *intel_names_mask[] = {
+static const char *const intel_names_mask[] = {
   "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
 };
-static const char *att_names_mask[] = {
+static const char *const att_names_mask[] = {
   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
 };
 
@@ -10185,7 +10185,7 @@ static const struct dis386 float_reg[][8
   },
 };
 
-static char *fgrps[][8] = {
+static const char *const fgrps[][8] = {
   /* Bad opcode 0 */
   {
     "(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)",
@@ -11283,7 +11283,7 @@ static void
 print_register (instr_info *ins, unsigned int reg, unsigned int rexmask,
 		int bytemode, int sizeflag)
 {
-  const char **names;
+  const char *const *names;
 
   USED_REX (rexmask);
   if (ins->rex & rexmask)
@@ -11524,8 +11524,8 @@ OP_E_memory (instr_info *ins, int bytemo
 			 || bytemode == bnd_mode
 			 || bytemode == bnd_swap_mode);
       bool check_gather = false;
-      const char **indexes64 = ins->names64;
-      const char **indexes32 = ins->names32;
+      const char *const *indexes64 = ins->names64;
+      const char *const *indexes32 = ins->names32;
 
       havesib = 0;
       havebase = 1;
@@ -12556,7 +12556,7 @@ OP_MMX (instr_info *ins, int bytemode AT
 	int sizeflag ATTRIBUTE_UNUSED)
 {
   int reg = ins->modrm.reg;
-  const char **names;
+  const char *const *names;
 
   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   if (ins->prefixes & PREFIX_DATA)
@@ -12574,7 +12574,7 @@ OP_MMX (instr_info *ins, int bytemode AT
 static void
 print_vector_reg (instr_info *ins, unsigned int reg, int bytemode)
 {
-  const char **names;
+  const char *const *names;
 
   if (bytemode == xmmq_mode
       || bytemode == evex_half_bcst_xmmqh_mode
@@ -12670,7 +12670,7 @@ static void
 OP_EM (instr_info *ins, int bytemode, int sizeflag)
 {
   int reg;
-  const char **names;
+  const char *const *names;
 
   if (ins->modrm.mod != 3)
     {
@@ -13040,8 +13040,8 @@ OP_Monitor (instr_info *ins, int bytemod
   /* monitor %{e,r,}ax,%ecx,%edx"  */
   if (!ins->intel_syntax)
     {
-      const char **names = (ins->address_mode == mode_64bit
-			    ? ins->names64 : ins->names32);
+      const char *const *names = (ins->address_mode == mode_64bit
+				  ? ins->names64 : ins->names32);
 
       if (ins->prefixes & PREFIX_ADDR)
 	{
@@ -13217,7 +13217,7 @@ CMPXCHG8B_Fixup (instr_info *ins, int by
 static void
 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
 {
-  const char **names;
+  const char *const *names;
 
   if (ins->need_vex)
     {
@@ -13261,7 +13261,7 @@ static void
 OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
 {
   int reg, modrm_reg, sib_index = -1;
-  const char **names;
+  const char *const *names;
 
   if (!ins->need_vex)
     abort ();
@@ -13432,7 +13432,7 @@ static void
 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
 {
   int reg;
-  const char **names = ins->names_xmm;
+  const char *const *names = ins->names_xmm;
 
   FETCH_DATA (ins->info, ins->codep + 1);
   reg = *ins->codep++;


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/5] x86: fold variables in memory operand index handling
  2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
  2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
@ 2022-01-14 13:52 ` Jan Beulich
  2022-01-14 13:53 ` [PATCH 3/5] x86: drop most Intel syntax register name arrays Jan Beulich
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:52 UTC (permalink / raw)
  To: Binutils

There's no real need for the pseudo-boolean "haveindex" or for separate
32-bit / 64-bit index pointers. Fold them into a single "indexes" and
set that uniformly to AT&T names, compensating by emitting the register
name via oappend_maybe_intel().

--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -11512,7 +11512,6 @@ OP_E_memory (instr_info *ins, int bytemo
       int havedisp;
       int havesib;
       int havebase;
-      int haveindex;
       int needindex;
       int needaddr32;
       int base, rbase;
@@ -11524,12 +11523,10 @@ OP_E_memory (instr_info *ins, int bytemo
 			 || bytemode == bnd_mode
 			 || bytemode == bnd_swap_mode);
       bool check_gather = false;
-      const char *const *indexes64 = ins->names64;
-      const char *const *indexes32 = ins->names32;
+      const char *const *indexes = NULL;
 
       havesib = 0;
       havebase = 1;
-      haveindex = 0;
       base = ins->modrm.rm;
 
       if (base == 4)
@@ -11552,32 +11549,33 @@ OP_E_memory (instr_info *ins, int bytemo
 		  check_gather = ins->obufp == ins->op_out[1];
 		}
 
-	      haveindex = 1;
 	      switch (ins->vex.length)
 		{
 		case 128:
-		  indexes64 = indexes32 = ins->names_xmm;
+		  indexes = att_names_xmm;
 		  break;
 		case 256:
 		  if (!ins->vex.w
 		      || bytemode == vex_vsib_q_w_dq_mode)
-		    indexes64 = indexes32 = ins->names_ymm;
+		    indexes = att_names_ymm;
 		  else
-		    indexes64 = indexes32 = ins->names_xmm;
+		    indexes = att_names_xmm;
 		  break;
 		case 512:
 		  if (!ins->vex.w
 		      || bytemode == vex_vsib_q_w_dq_mode)
-		    indexes64 = indexes32 = ins->names_zmm;
+		    indexes = att_names_zmm;
 		  else
-		    indexes64 = indexes32 = ins->names_ymm;
+		    indexes = att_names_ymm;
 		  break;
 		default:
 		  abort ();
 		}
 	      break;
 	    default:
-	      haveindex = vindex != 4;
+	      if (vindex != 4)
+		indexes = ins->address_mode == mode_64bit && !addr32flag
+			  ? att_names64 : att_names32;
 	      break;
 	    }
 	  scale = ins->sib.scale;
@@ -11630,7 +11628,7 @@ OP_E_memory (instr_info *ins, int bytemo
       needaddr32 = 0;
       if (havesib
 	  && !havebase
-	  && !haveindex
+	  && !indexes
 	  && ins->address_mode != mode_16bit)
 	{
 	  if (ins->address_mode == mode_64bit)
@@ -11654,7 +11652,7 @@ OP_E_memory (instr_info *ins, int bytemo
 
       havedisp = (havebase
 		  || needindex
-		  || (havesib && (haveindex || scale != 0)));
+		  || (havesib && (indexes || scale != 0)));
 
       if (!ins->intel_syntax)
 	if (ins->modrm.mod != 0 || base == 5)
@@ -11671,7 +11669,7 @@ OP_E_memory (instr_info *ins, int bytemo
 	      }
 	  }
 
-      if ((havebase || haveindex || needindex || needaddr32 || riprel)
+      if ((havebase || indexes || needindex || needaddr32 || riprel)
 	  && (ins->address_mode != mode_64bit
 	      || ((bytemode != v_bnd_mode)
 		  && (bytemode != v_bndmk_mode)
@@ -11697,7 +11695,7 @@ OP_E_memory (instr_info *ins, int bytemo
 		 print index to tell base + index from base.  */
 	      if (scale != 0
 		  || needindex
-		  || haveindex
+		  || indexes
 		  || (havebase && base != ESP_REG_NUM))
 		{
 		  if (!ins->intel_syntax || havebase)
@@ -11705,12 +11703,10 @@ OP_E_memory (instr_info *ins, int bytemo
 		      *ins->obufp++ = ins->separator_char;
 		      *ins->obufp = '\0';
 		    }
-		  if (haveindex)
+		  if (indexes)
 		    {
 		      if (ins->address_mode == mode_64bit || vindex < 16)
-			oappend (ins, ins->address_mode == mode_64bit
-				 && !addr32flag
-				 ? indexes64[vindex] : indexes32[vindex]);
+			oappend_maybe_intel (ins, indexes[vindex]);
 		      else
 			oappend (ins, "(bad)");
 		    }


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 3/5] x86: drop most Intel syntax register name arrays
  2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
  2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
  2022-01-14 13:52 ` [PATCH 2/5] x86: fold variables in memory operand index handling Jan Beulich
@ 2022-01-14 13:53 ` Jan Beulich
  2022-01-14 13:53 ` [PATCH 4/5] x86: drop index16 field Jan Beulich
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:53 UTC (permalink / raw)
  To: Binutils

By making use of, in particular, oappend_maybe_intel() there's no need
for this redundant set of static data.

--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -219,22 +219,7 @@ struct instr_info
   vex;
   unsigned char need_vex;
 
-  const char *const *names64;
-  const char *const *names32;
-  const char *const *names16;
-  const char *const *names8;
-  const char *const *names8rex;
-  const char *const *names_seg;
-  const char *index64;
-  const char *index32;
   const char *const *index16;
-  const char *const *names_bnd;
-  const char *const *names_mm;
-  const char *const *names_xmm;
-  const char *const *names_ymm;
-  const char *const *names_zmm;
-  const char *const *names_tmm;
-  const char *const *names_mask;
 
   /* Remember if the current op is a jump instruction.  */
   bool op_is_jump;
@@ -2423,30 +2408,6 @@ struct op
    need to update onebyte_has_modrm or twobyte_has_modrm.  */
 #define MODRM_CHECK  if (!ins->need_modrm) abort ()
 
-static const char *const intel_names64[] = {
-  "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
-  "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
-};
-static const char *const intel_names32[] = {
-  "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi",
-  "r8d", "r9d", "r10d", "r11d", "r12d", "r13d", "r14d", "r15d"
-};
-static const char *const intel_names16[] = {
-  "ax", "cx", "dx", "bx", "sp", "bp", "si", "di",
-  "r8w", "r9w", "r10w", "r11w", "r12w", "r13w", "r14w", "r15w"
-};
-static const char *const intel_names8[] = {
-  "al", "cl", "dl", "bl", "ah", "ch", "dh", "bh",
-};
-static const char *const intel_names8rex[] = {
-  "al", "cl", "dl", "bl", "spl", "bpl", "sil", "dil",
-  "r8b", "r9b", "r10b", "r11b", "r12b", "r13b", "r14b", "r15b"
-};
-static const char *const intel_names_seg[] = {
-  "es", "cs", "ss", "ds", "fs", "gs", "?", "?",
-};
-static const char intel_index64[] = "riz";
-static const char intel_index32[] = "eiz";
 static const char *const intel_index16[] = {
   "bx+si", "bx+di", "bp+si", "bp+di", "si", "di", "bp", "bx"
 };
@@ -2479,33 +2440,15 @@ static const char *const att_index16[] =
   "%bx,%si", "%bx,%di", "%bp,%si", "%bp,%di", "%si", "%di", "%bp", "%bx"
 };
 
-static const char *const intel_names_mm[] = {
-  "mm0", "mm1", "mm2", "mm3",
-  "mm4", "mm5", "mm6", "mm7"
-};
 static const char *const att_names_mm[] = {
   "%mm0", "%mm1", "%mm2", "%mm3",
   "%mm4", "%mm5", "%mm6", "%mm7"
 };
 
-static const char *const intel_names_bnd[] = {
-  "bnd0", "bnd1", "bnd2", "bnd3"
-};
-
 static const char *const att_names_bnd[] = {
   "%bnd0", "%bnd1", "%bnd2", "%bnd3"
 };
 
-static const char *const intel_names_xmm[] = {
-  "xmm0", "xmm1", "xmm2", "xmm3",
-  "xmm4", "xmm5", "xmm6", "xmm7",
-  "xmm8", "xmm9", "xmm10", "xmm11",
-  "xmm12", "xmm13", "xmm14", "xmm15",
-  "xmm16", "xmm17", "xmm18", "xmm19",
-  "xmm20", "xmm21", "xmm22", "xmm23",
-  "xmm24", "xmm25", "xmm26", "xmm27",
-  "xmm28", "xmm29", "xmm30", "xmm31"
-};
 static const char *const att_names_xmm[] = {
   "%xmm0", "%xmm1", "%xmm2", "%xmm3",
   "%xmm4", "%xmm5", "%xmm6", "%xmm7",
@@ -2517,16 +2460,6 @@ static const char *const att_names_xmm[]
   "%xmm28", "%xmm29", "%xmm30", "%xmm31"
 };
 
-static const char *const intel_names_ymm[] = {
-  "ymm0", "ymm1", "ymm2", "ymm3",
-  "ymm4", "ymm5", "ymm6", "ymm7",
-  "ymm8", "ymm9", "ymm10", "ymm11",
-  "ymm12", "ymm13", "ymm14", "ymm15",
-  "ymm16", "ymm17", "ymm18", "ymm19",
-  "ymm20", "ymm21", "ymm22", "ymm23",
-  "ymm24", "ymm25", "ymm26", "ymm27",
-  "ymm28", "ymm29", "ymm30", "ymm31"
-};
 static const char *const att_names_ymm[] = {
   "%ymm0", "%ymm1", "%ymm2", "%ymm3",
   "%ymm4", "%ymm5", "%ymm6", "%ymm7",
@@ -2538,16 +2471,6 @@ static const char *const att_names_ymm[]
   "%ymm28", "%ymm29", "%ymm30", "%ymm31"
 };
 
-static const char *const intel_names_zmm[] = {
-  "zmm0", "zmm1", "zmm2", "zmm3",
-  "zmm4", "zmm5", "zmm6", "zmm7",
-  "zmm8", "zmm9", "zmm10", "zmm11",
-  "zmm12", "zmm13", "zmm14", "zmm15",
-  "zmm16", "zmm17", "zmm18", "zmm19",
-  "zmm20", "zmm21", "zmm22", "zmm23",
-  "zmm24", "zmm25", "zmm26", "zmm27",
-  "zmm28", "zmm29", "zmm30", "zmm31"
-};
 static const char *const att_names_zmm[] = {
   "%zmm0", "%zmm1", "%zmm2", "%zmm3",
   "%zmm4", "%zmm5", "%zmm6", "%zmm7",
@@ -2559,18 +2482,11 @@ static const char *const att_names_zmm[]
   "%zmm28", "%zmm29", "%zmm30", "%zmm31"
 };
 
-static const char *const intel_names_tmm[] = {
-  "tmm0", "tmm1", "tmm2", "tmm3",
-  "tmm4", "tmm5", "tmm6", "tmm7"
-};
 static const char *const att_names_tmm[] = {
   "%tmm0", "%tmm1", "%tmm2", "%tmm3",
   "%tmm4", "%tmm5", "%tmm6", "%tmm7"
 };
 
-static const char *const intel_names_mask[] = {
-  "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7"
-};
 static const char *const att_names_mask[] = {
   "%k0", "%k1", "%k2", "%k3", "%k4", "%k5", "%k6", "%k7"
 };
@@ -9377,6 +9293,14 @@ get_sib (instr_info *ins, int sizeflag)
     }
 }
 
+/* Like oappend (below), but S is a string starting with '%'.
+   In Intel syntax, the '%' is elided.  */
+static void
+oappend_maybe_intel (instr_info *ins, const char *s)
+{
+  oappend (ins, s + ins->intel_syntax);
+}
+
 static int
 print_insn (bfd_vma pc, instr_info *ins)
 {
@@ -9480,21 +9404,6 @@ print_insn (bfd_vma pc, instr_info *ins)
 
   if (ins->intel_syntax)
     {
-      ins->names64 = intel_names64;
-      ins->names32 = intel_names32;
-      ins->names16 = intel_names16;
-      ins->names8 = intel_names8;
-      ins->names8rex = intel_names8rex;
-      ins->names_seg = intel_names_seg;
-      ins->names_mm = intel_names_mm;
-      ins->names_bnd = intel_names_bnd;
-      ins->names_xmm = intel_names_xmm;
-      ins->names_ymm = intel_names_ymm;
-      ins->names_zmm = intel_names_zmm;
-      ins->names_tmm = intel_names_tmm;
-      ins->index64 = intel_index64;
-      ins->index32 = intel_index32;
-      ins->names_mask = intel_names_mask;
       ins->index16 = intel_index16;
       ins->open_char = '[';
       ins->close_char = ']';
@@ -9503,21 +9412,6 @@ print_insn (bfd_vma pc, instr_info *ins)
     }
   else
     {
-      ins->names64 = att_names64;
-      ins->names32 = att_names32;
-      ins->names16 = att_names16;
-      ins->names8 = att_names8;
-      ins->names8rex = att_names8rex;
-      ins->names_seg = att_names_seg;
-      ins->names_mm = att_names_mm;
-      ins->names_bnd = att_names_bnd;
-      ins->names_xmm = att_names_xmm;
-      ins->names_ymm = att_names_ymm;
-      ins->names_zmm = att_names_zmm;
-      ins->names_tmm = att_names_tmm;
-      ins->index64 = att_index64;
-      ins->index32 = att_index32;
-      ins->names_mask = att_names_mask;
       ins->index16 = att_index16;
       ins->open_char = '(';
       ins->close_char =  ')';
@@ -9673,8 +9567,9 @@ print_insn (bfd_vma pc, instr_info *ins)
 		  if (ins->vex.mask_register_specifier)
 		    {
 		      oappend (ins, "{");
-		      oappend (ins,
-			     ins->names_mask[ins->vex.mask_register_specifier]);
+		      oappend_maybe_intel (ins,
+					   att_names_mask
+					   [ins->vex.mask_register_specifier]);
 		      oappend (ins, "}");
 		    }
 		  if (ins->vex.zeroing)
@@ -10285,7 +10180,7 @@ dofloat (instr_info *ins, int sizeflag)
 
       /* Instruction fnstsw is only one with strange arg.  */
       if (floatop == 0xdf && ins->codep[-1] == 0xe0)
-	strcpy (ins->op_out[0], ins->names16[0]);
+	strcpy (ins->op_out[0], att_names16[0] + ins->intel_syntax);
     }
   else
     {
@@ -10303,14 +10198,6 @@ dofloat (instr_info *ins, int sizeflag)
     }
 }
 
-/* Like oappend (below), but S is a string starting with '%'.
-   In Intel syntax, the '%' is elided.  */
-static void
-oappend_maybe_intel (instr_info *ins, const char *s)
-{
-  oappend (ins, s + ins->intel_syntax);
-}
-
 static void
 OP_ST (instr_info *ins, int bytemode ATTRIBUTE_UNUSED,
        int sizeflag ATTRIBUTE_UNUSED)
@@ -11296,24 +11183,24 @@ print_register (instr_info *ins, unsigne
       if (reg & 4)
 	USED_REX (0);
       if (ins->rex)
-	names = ins->names8rex;
+	names = att_names8rex;
       else
-	names = ins->names8;
+	names = att_names8;
       break;
     case w_mode:
-      names = ins->names16;
+      names = att_names16;
       break;
     case d_mode:
     case dw_mode:
     case db_mode:
-      names = ins->names32;
+      names = att_names32;
       break;
     case q_mode:
-      names = ins->names64;
+      names = att_names64;
       break;
     case m_mode:
     case v_bnd_mode:
-      names = ins->address_mode == mode_64bit ? ins->names64 : ins->names32;
+      names = ins->address_mode == mode_64bit ? att_names64 : att_names32;
       break;
     case bnd_mode:
     case bnd_swap_mode:
@@ -11322,12 +11209,12 @@ print_register (instr_info *ins, unsigne
 	  oappend (ins, "(bad)");
 	  return;
 	}
-      names = ins->names_bnd;
+      names = att_names_bnd;
       break;
     case indir_v_mode:
       if (ins->address_mode == mode_64bit && ins->isa64 == intel64)
 	{
-	  names = ins->names64;
+	  names = att_names64;
 	  break;
 	}
       /* Fall through.  */
@@ -11335,7 +11222,7 @@ print_register (instr_info *ins, unsigne
       if (ins->address_mode == mode_64bit && ((sizeflag & DFLAG)
 					      || (ins->rex & REX_W)))
 	{
-	  names = ins->names64;
+	  names = att_names64;
 	  break;
 	}
       bytemode = v_mode;
@@ -11345,37 +11232,37 @@ print_register (instr_info *ins, unsigne
     case dq_mode:
       USED_REX (REX_W);
       if (ins->rex & REX_W)
-	names = ins->names64;
+	names = att_names64;
       else if (bytemode != v_mode && bytemode != v_swap_mode)
-	names = ins->names32;
+	names = att_names32;
       else
 	{
 	  if (sizeflag & DFLAG)
-	    names = ins->names32;
+	    names = att_names32;
 	  else
-	    names = ins->names16;
+	    names = att_names16;
 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
 	}
       break;
     case movsxd_mode:
       if (!(sizeflag & DFLAG) && ins->isa64 == intel64)
-	names = ins->names16;
+	names = att_names16;
       else
-	names = ins->names32;
+	names = att_names32;
       ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
       break;
     case va_mode:
       names = (ins->address_mode == mode_64bit
-	       ? ins->names64 : ins->names32);
+	       ? att_names64 : att_names32);
       if (!(ins->prefixes & PREFIX_ADDR))
 	names = (ins->address_mode == mode_16bit
-		     ? ins->names16 : names);
+		     ? att_names16 : names);
       else
 	{
 	  /* Remove "addr16/addr32".  */
 	  ins->all_prefixes[ins->last_addr_prefix] = 0;
 	  names = (ins->address_mode != mode_32bit
-		       ? ins->names32 : ins->names16);
+		       ? att_names32 : att_names16);
 	  ins->used_prefixes |= PREFIX_ADDR;
 	}
       break;
@@ -11386,7 +11273,7 @@ print_register (instr_info *ins, unsigne
 	  oappend (ins, "(bad)");
 	  return;
 	}
-      names = ins->names_mask;
+      names = att_names_mask;
       break;
     case 0:
       return;
@@ -11394,7 +11281,7 @@ print_register (instr_info *ins, unsigne
       oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
       return;
     }
-  oappend (ins, names[reg]);
+  oappend_maybe_intel (ins, names[reg]);
 }
 
 static void
@@ -11687,8 +11574,9 @@ OP_E_memory (instr_info *ins, int bytemo
 	    }
 	  *ins->obufp = '\0';
 	  if (havebase)
-	    oappend (ins, ins->address_mode == mode_64bit && !addr32flag
-		     ? ins->names64[rbase] : ins->names32[rbase]);
+	    oappend_maybe_intel (ins,
+				 (ins->address_mode == mode_64bit && !addr32flag
+				  ? att_names64 : att_names32)[rbase]);
 	  if (havesib)
 	    {
 	      /* ESP/RSP won't allow index.  If base isn't ESP/RSP,
@@ -11711,8 +11599,10 @@ OP_E_memory (instr_info *ins, int bytemo
 			oappend (ins, "(bad)");
 		    }
 		  else
-		    oappend (ins, ins->address_mode == mode_64bit && !addr32flag
-			     ? ins->index64 : ins->index32);
+		    oappend_maybe_intel (ins,
+					 ins->address_mode == mode_64bit
+					 && !addr32flag ? att_index64
+							: att_index32);
 
 		  *ins->obufp++ = ins->scale_char;
 		  *ins->obufp = '\0';
@@ -11764,7 +11654,7 @@ OP_E_memory (instr_info *ins, int bytemo
 	    {
 	      if (!ins->active_seg_prefix)
 		{
-		  oappend (ins, ins->names_seg[ds_reg - es_reg]);
+		  oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
 		  oappend (ins, ":");
 		}
 	      print_operand_value (ins, ins->scratchbuf, 1, disp);
@@ -11849,7 +11739,7 @@ OP_E_memory (instr_info *ins, int bytemo
 	{
 	  if (!ins->active_seg_prefix)
 	    {
-	      oappend (ins, ins->names_seg[ds_reg - es_reg]);
+	      oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
 	      oappend (ins, ":");
 	    }
 	  print_operand_value (ins, ins->scratchbuf, 1, disp & 0xffff);
@@ -12065,7 +11955,7 @@ OP_REG (instr_info *ins, int code, int s
     {
     case es_reg: case ss_reg: case cs_reg:
     case ds_reg: case fs_reg: case gs_reg:
-      oappend (ins, ins->names_seg[code - es_reg]);
+      oappend_maybe_intel (ins, att_names_seg[code - es_reg]);
       return;
     }
 
@@ -12079,23 +11969,23 @@ OP_REG (instr_info *ins, int code, int s
     {
     case ax_reg: case cx_reg: case dx_reg: case bx_reg:
     case sp_reg: case bp_reg: case si_reg: case di_reg:
-      s = ins->names16[code - ax_reg + add];
+      s = att_names16[code - ax_reg + add];
       break;
     case ah_reg: case ch_reg: case dh_reg: case bh_reg:
       USED_REX (0);
       /* Fall through.  */
     case al_reg: case cl_reg: case dl_reg: case bl_reg:
       if (ins->rex)
-	s = ins->names8rex[code - al_reg + add];
+	s = att_names8rex[code - al_reg + add];
       else
-	s = ins->names8[code - al_reg];
+	s = att_names8[code - al_reg];
       break;
     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
       if (ins->address_mode == mode_64bit
 	  && ((sizeflag & DFLAG) || (ins->rex & REX_W)))
 	{
-	  s = ins->names64[code - rAX_reg + add];
+	  s = att_names64[code - rAX_reg + add];
 	  break;
 	}
       code += eAX_reg - rAX_reg;
@@ -12104,21 +11994,21 @@ OP_REG (instr_info *ins, int code, int s
     case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg:
       USED_REX (REX_W);
       if (ins->rex & REX_W)
-	s = ins->names64[code - eAX_reg + add];
+	s = att_names64[code - eAX_reg + add];
       else
 	{
 	  if (sizeflag & DFLAG)
-	    s = ins->names32[code - eAX_reg + add];
+	    s = att_names32[code - eAX_reg + add];
 	  else
-	    s = ins->names16[code - eAX_reg + add];
+	    s = att_names16[code - eAX_reg + add];
 	  ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
 	}
       break;
     default:
-      s = INTERNAL_DISASSEMBLER_ERROR;
-      break;
+      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
+      return;
     }
-  oappend (ins, s);
+  oappend_maybe_intel (ins, s);
 }
 
 static void
@@ -12129,35 +12019,37 @@ OP_IMREG (instr_info *ins, int code, int
   switch (code)
     {
     case indir_dx_reg:
-      if (ins->intel_syntax)
-	s = "dx";
-      else
-	s = "(%dx)";
+      if (!ins->intel_syntax)
+	{
+	  oappend (ins, "(%dx)");
+	  return;
+	}
+      s = att_names16[dx_reg - ax_reg];
       break;
     case al_reg: case cl_reg:
-      s = ins->names8[code - al_reg];
+      s = att_names8[code - al_reg];
       break;
     case eAX_reg:
       USED_REX (REX_W);
       if (ins->rex & REX_W)
 	{
-	  s = *ins->names64;
+	  s = *att_names64;
 	  break;
 	}
       /* Fall through.  */
     case z_mode_ax_reg:
       if ((ins->rex & REX_W) || (sizeflag & DFLAG))
-	s = *ins->names32;
+	s = *att_names32;
       else
-	s = *ins->names16;
+	s = *att_names16;
       if (!(ins->rex & REX_W))
 	ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
       break;
     default:
-      s = INTERNAL_DISASSEMBLER_ERROR;
-      break;
+      oappend (ins, INTERNAL_DISASSEMBLER_ERROR);
+      return;
     }
-  oappend (ins, s);
+  oappend_maybe_intel (ins, s);
 }
 
 static void
@@ -12342,7 +12234,7 @@ static void
 OP_SEG (instr_info *ins, int bytemode, int sizeflag)
 {
   if (bytemode == w_mode)
-    oappend (ins, ins->names_seg[ins->modrm.reg]);
+    oappend_maybe_intel (ins, att_names_seg[ins->modrm.reg]);
   else
     OP_E (ins, ins->modrm.mod == 3 ? bytemode : w_mode, sizeflag);
 }
@@ -12388,7 +12280,7 @@ OP_OFF (instr_info *ins, int bytemode, i
     {
       if (!ins->active_seg_prefix)
 	{
-	  oappend (ins, ins->names_seg[ds_reg - es_reg]);
+	  oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
 	  oappend (ins, ":");
 	}
     }
@@ -12418,7 +12310,7 @@ OP_OFF64 (instr_info *ins, int bytemode,
     {
       if (!ins->active_seg_prefix)
 	{
-	  oappend (ins, ins->names_seg[ds_reg - es_reg]);
+	  oappend_maybe_intel (ins, att_names_seg[ds_reg - es_reg]);
 	  oappend (ins, ":");
 	}
     }
@@ -12436,15 +12328,15 @@ ptr_reg (instr_info *ins, int code, int
   if (ins->address_mode == mode_64bit)
     {
       if (!(sizeflag & AFLAG))
-	s = ins->names32[code - eAX_reg];
+	s = att_names32[code - eAX_reg];
       else
-	s = ins->names64[code - eAX_reg];
+	s = att_names64[code - eAX_reg];
     }
   else if (sizeflag & AFLAG)
-    s = ins->names32[code - eAX_reg];
+    s = att_names32[code - eAX_reg];
   else
-    s = ins->names16[code - eAX_reg];
-  oappend (ins, s);
+    s = att_names16[code - eAX_reg];
+  oappend_maybe_intel (ins, s);
   *ins->obufp++ = ins->close_char;
   *ins->obufp = 0;
 }
@@ -12557,14 +12449,14 @@ OP_MMX (instr_info *ins, int bytemode AT
   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
   if (ins->prefixes & PREFIX_DATA)
     {
-      names = ins->names_xmm;
+      names = att_names_xmm;
       USED_REX (REX_R);
       if (ins->rex & REX_R)
 	reg += 8;
     }
   else
-    names = ins->names_mm;
-  oappend (ins, names[reg]);
+    names = att_names_mm;
+  oappend_maybe_intel (ins, names[reg]);
 }
 
 static void
@@ -12580,17 +12472,17 @@ print_vector_reg (instr_info *ins, unsig
 	{
 	case 128:
 	case 256:
-	  names = ins->names_xmm;
+	  names = att_names_xmm;
 	  break;
 	case 512:
-	  names = ins->names_ymm;
+	  names = att_names_ymm;
 	  break;
 	default:
 	  abort ();
 	}
     }
   else if (bytemode == ymm_mode)
-    names = ins->names_ymm;
+    names = att_names_ymm;
   else if (bytemode == tmm_mode)
     {
       if (reg >= 8)
@@ -12598,7 +12490,7 @@ print_vector_reg (instr_info *ins, unsig
 	  oappend (ins, "(bad)");
 	  return;
 	}
-      names = ins->names_tmm;
+      names = att_names_tmm;
     }
   else if (ins->need_vex
 	   && bytemode != xmm_mode
@@ -12615,29 +12507,29 @@ print_vector_reg (instr_info *ins, unsig
       switch (ins->vex.length)
 	{
 	case 128:
-	  names = ins->names_xmm;
+	  names = att_names_xmm;
 	  break;
 	case 256:
 	  if (ins->vex.w
 	      || bytemode != vex_vsib_q_w_dq_mode)
-	    names = ins->names_ymm;
+	    names = att_names_ymm;
 	  else
-	    names = ins->names_xmm;
+	    names = att_names_xmm;
 	  break;
 	case 512:
 	  if (ins->vex.w
 	      || bytemode != vex_vsib_q_w_dq_mode)
-	    names = ins->names_zmm;
+	    names = att_names_zmm;
 	  else
-	    names = ins->names_ymm;
+	    names = att_names_ymm;
 	  break;
 	default:
 	  abort ();
 	}
     }
   else
-    names = ins->names_xmm;
-  oappend (ins, names[reg]);
+    names = att_names_xmm;
+  oappend_maybe_intel (ins, names[reg]);
 }
 
 static void
@@ -12690,14 +12582,14 @@ OP_EM (instr_info *ins, int bytemode, in
   reg = ins->modrm.rm;
   if (ins->prefixes & PREFIX_DATA)
     {
-      names = ins->names_xmm;
+      names = att_names_xmm;
       USED_REX (REX_B);
       if (ins->rex & REX_B)
 	reg += 8;
     }
   else
-    names = ins->names_mm;
-  oappend (ins, names[reg]);
+    names = att_names_mm;
+  oappend_maybe_intel (ins, names[reg]);
 }
 
 /* cvt* are the only instructions in sse2 which have
@@ -12723,7 +12615,7 @@ OP_EMC (instr_info *ins, int bytemode, i
   MODRM_CHECK;
   ins->codep++;
   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
-  oappend (ins, ins->names_mm[ins->modrm.rm]);
+  oappend_maybe_intel (ins, att_names_mm[ins->modrm.rm]);
 }
 
 static void
@@ -12731,7 +12623,7 @@ OP_MXC (instr_info *ins, int bytemode AT
 	int sizeflag ATTRIBUTE_UNUSED)
 {
   ins->used_prefixes |= (ins->prefixes & PREFIX_DATA);
-  oappend (ins, ins->names_mm[ins->modrm.reg]);
+  oappend_maybe_intel (ins, att_names_mm[ins->modrm.reg]);
 }
 
 static void
@@ -13018,10 +12910,10 @@ OP_Mwait (instr_info *ins, int bytemode,
   /* mwait %eax,%ecx / mwaitx %eax,%ecx,%ebx  */
   if (!ins->intel_syntax)
     {
-      strcpy (ins->op_out[0], ins->names32[0]);
-      strcpy (ins->op_out[1], ins->names32[1]);
+      strcpy (ins->op_out[0], att_names32[0] + ins->intel_syntax);
+      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
       if (bytemode == eBX_reg)
-	strcpy (ins->op_out[2], ins->names32[3]);
+	strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
       ins->two_source_ops = 1;
     }
   /* Skip mod/rm byte.  */
@@ -13037,21 +12929,21 @@ OP_Monitor (instr_info *ins, int bytemod
   if (!ins->intel_syntax)
     {
       const char *const *names = (ins->address_mode == mode_64bit
-				  ? ins->names64 : ins->names32);
+				  ? att_names64 : att_names32);
 
       if (ins->prefixes & PREFIX_ADDR)
 	{
 	  /* Remove "addr16/addr32".  */
 	  ins->all_prefixes[ins->last_addr_prefix] = 0;
 	  names = (ins->address_mode != mode_32bit
-		   ? ins->names32 : ins->names16);
+		   ? att_names32 : att_names16);
 	  ins->used_prefixes |= PREFIX_ADDR;
 	}
       else if (ins->address_mode == mode_16bit)
-	names = ins->names16;
-      strcpy (ins->op_out[0], names[0]);
-      strcpy (ins->op_out[1], ins->names32[1]);
-      strcpy (ins->op_out[2], ins->names32[2]);
+	names = att_names16;
+      strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
+      strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
+      strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
       ins->two_source_ops = 1;
     }
   /* Skip mod/rm byte.  */
@@ -13213,25 +13105,22 @@ CMPXCHG8B_Fixup (instr_info *ins, int by
 static void
 XMM_Fixup (instr_info *ins, int reg, int sizeflag ATTRIBUTE_UNUSED)
 {
-  const char *const *names;
+  const char *const *names = att_names_xmm;
 
   if (ins->need_vex)
     {
       switch (ins->vex.length)
 	{
 	case 128:
-	  names = ins->names_xmm;
 	  break;
 	case 256:
-	  names = ins->names_ymm;
+	  names = att_names_ymm;
 	  break;
 	default:
 	  abort ();
 	}
     }
-  else
-    names = ins->names_xmm;
-  oappend (ins, names[reg]);
+  oappend_maybe_intel (ins, names[reg]);
 }
 
 static void
@@ -13280,7 +13169,7 @@ OP_VEX (instr_info *ins, int bytemode, i
   switch (bytemode)
     {
     case scalar_mode:
-      oappend (ins, ins->names_xmm[reg]);
+      oappend_maybe_intel (ins, att_names_xmm[reg]);
       return;
 
     case vex_vsib_d_w_dq_mode:
@@ -13291,9 +13180,9 @@ OP_VEX (instr_info *ins, int bytemode, i
       if (ins->vex.length == 128
 	  || (bytemode != vex_vsib_d_w_dq_mode
 	      && !ins->vex.w))
-	oappend (ins, ins->names_xmm[reg]);
+	oappend_maybe_intel (ins, att_names_xmm[reg]);
       else
-	oappend (ins, ins->names_ymm[reg]);
+	oappend_maybe_intel (ins, att_names_ymm[reg]);
 
       /* All 3 XMM/YMM registers must be distinct.  */
       modrm_reg = ins->modrm.reg;
@@ -13325,7 +13214,7 @@ OP_VEX (instr_info *ins, int bytemode, i
 	  /* This must be the 3rd operand.  */
 	  if (ins->obufp != ins->op_out[2])
 	    abort ();
-	  oappend (ins, ins->names_tmm[reg]);
+	  oappend_maybe_intel (ins, att_names_tmm[reg]);
 	  if (reg == ins->modrm.reg || reg == ins->modrm.rm)
 	    strcpy (ins->obufp, "/(bad)");
 	}
@@ -13350,13 +13239,13 @@ OP_VEX (instr_info *ins, int bytemode, i
       switch (bytemode)
 	{
 	case x_mode:
-	  names = ins->names_xmm;
+	  names = att_names_xmm;
 	  break;
 	case dq_mode:
 	  if (ins->rex & REX_W)
-	    names = ins->names64;
+	    names = att_names64;
 	  else
-	    names = ins->names32;
+	    names = att_names32;
 	  break;
 	case mask_bd_mode:
 	case mask_mode:
@@ -13365,7 +13254,7 @@ OP_VEX (instr_info *ins, int bytemode, i
 	      oappend (ins, "(bad)");
 	      return;
 	    }
-	  names = ins->names_mask;
+	  names = att_names_mask;
 	  break;
 	default:
 	  abort ();
@@ -13376,7 +13265,7 @@ OP_VEX (instr_info *ins, int bytemode, i
       switch (bytemode)
 	{
 	case x_mode:
-	  names = ins->names_ymm;
+	  names = att_names_ymm;
 	  break;
 	case mask_bd_mode:
 	case mask_mode:
@@ -13385,7 +13274,7 @@ OP_VEX (instr_info *ins, int bytemode, i
 	      oappend (ins, "(bad)");
 	      return;
 	    }
-	  names = ins->names_mask;
+	  names = att_names_mask;
 	  break;
 	default:
 	  /* See PR binutils/20893 for a reproducer.  */
@@ -13394,13 +13283,13 @@ OP_VEX (instr_info *ins, int bytemode, i
 	}
       break;
     case 512:
-      names = ins->names_zmm;
+      names = att_names_zmm;
       break;
     default:
       abort ();
       break;
     }
-  oappend (ins, names[reg]);
+  oappend_maybe_intel (ins, names[reg]);
 }
 
 static void
@@ -13428,7 +13317,7 @@ static void
 OP_REG_VexI4 (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED)
 {
   int reg;
-  const char *const *names = ins->names_xmm;
+  const char *const *names = att_names_xmm;
 
   FETCH_DATA (ins->info, ins->codep + 1);
   reg = *ins->codep++;
@@ -13441,9 +13330,9 @@ OP_REG_VexI4 (instr_info *ins, int bytem
     reg &= 7;
 
   if (bytemode == x_mode && ins->vex.length == 256)
-    names = ins->names_ymm;
+    names = att_names_ymm;
 
-  oappend (ins, names[reg]);
+  oappend_maybe_intel (ins, names[reg]);
 
   if (ins->vex.w)
     {


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 4/5] x86: drop index16 field
  2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
                   ` (2 preceding siblings ...)
  2022-01-14 13:53 ` [PATCH 3/5] x86: drop most Intel syntax register name arrays Jan Beulich
@ 2022-01-14 13:53 ` Jan Beulich
  2022-01-14 13:54 ` [PATCH 5/5] x86: adjust struct instr_info field types Jan Beulich
  2022-01-14 14:36 ` [PATCH 0/5] x86: adjustments to struct instr_info (and more) H.J. Lu
  5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:53 UTC (permalink / raw)
  To: Binutils

There's a single use on a generally infrequently taken code path. Put the
necessary conditional there instead.

--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -219,8 +219,6 @@ struct instr_info
   vex;
   unsigned char need_vex;
 
-  const char *const *index16;
-
   /* Remember if the current op is a jump instruction.  */
   bool op_is_jump;
 
@@ -9404,7 +9402,6 @@ print_insn (bfd_vma pc, instr_info *ins)
 
   if (ins->intel_syntax)
     {
-      ins->index16 = intel_index16;
       ins->open_char = '[';
       ins->close_char = ']';
       ins->separator_char = '+';
@@ -9412,7 +9409,6 @@ print_insn (bfd_vma pc, instr_info *ins)
     }
   else
     {
-      ins->index16 = att_index16;
       ins->open_char = '(';
       ins->close_char =  ')';
       ins->separator_char = ',';
@@ -11712,7 +11708,9 @@ OP_E_memory (instr_info *ins, int bytemo
 	{
 	  *ins->obufp++ = ins->open_char;
 	  *ins->obufp = '\0';
-	  oappend (ins, ins->index16[ins->modrm.rm]);
+	  oappend (ins,
+		   (ins->intel_syntax ? intel_index16
+				      : att_index16)[ins->modrm.rm]);
 	  if (ins->intel_syntax
 	      && (disp || ins->modrm.mod != 0 || ins->modrm.rm == 6))
 	    {


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 5/5] x86: adjust struct instr_info field types
  2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
                   ` (3 preceding siblings ...)
  2022-01-14 13:53 ` [PATCH 4/5] x86: drop index16 field Jan Beulich
@ 2022-01-14 13:54 ` Jan Beulich
  2022-01-14 14:36 ` [PATCH 0/5] x86: adjustments to struct instr_info (and more) H.J. Lu
  5 siblings, 0 replies; 7+ messages in thread
From: Jan Beulich @ 2022-01-14 13:54 UTC (permalink / raw)
  To: Binutils

Now that this lives on the stack, let's have it be a little less
wasteful in terms of space. Switch boolean fields to "bool" (also when
this doesn't change their size) and also limit the widths of "rex",
"rex_used", "op_ad", and "op_index". Do a little bit of re-ordering as
well to limit the number of padding holes.
---
Obviously we could go further and use bitfields.

--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -147,9 +147,12 @@ struct instr_info
   int prefixes;
 
   /* REX prefix the current instruction.  See below.  */
-  int rex;
+  unsigned char rex;
   /* Bits of REX we've already used.  */
-  int rex_used;
+  unsigned char rex_used;
+
+  bool need_modrm;
+  bool need_vex;
 
   /* Flags for ins->prefixes which we somehow handled when printing the
      current instruction.  */
@@ -191,7 +194,6 @@ struct instr_info
     int rm;
   }
   modrm;
-  unsigned char need_modrm;
 
   struct
   {
@@ -206,25 +208,26 @@ struct instr_info
     int register_specifier;
     int length;
     int prefix;
-    int w;
-    int evex;
-    int r;
-    int v;
     int mask_register_specifier;
-    int zeroing;
     int ll;
-    int b;
-    int no_broadcast;
+    bool w;
+    bool evex;
+    bool r;
+    bool v;
+    bool zeroing;
+    bool b;
+    bool no_broadcast;
   }
   vex;
-  unsigned char need_vex;
 
   /* Remember if the current op is a jump instruction.  */
   bool op_is_jump;
 
+  bool two_source_ops;
+
+  unsigned char op_ad;
+  signed char op_index[MAX_OPERANDS];
   char op_out[MAX_OPERANDS][100];
-  int op_ad, op_index[MAX_OPERANDS];
-  int two_source_ops;
   bfd_vma op_address[MAX_OPERANDS];
   bfd_vma op_riprel[MAX_OPERANDS];
   bfd_vma start_pc;
@@ -237,7 +240,7 @@ struct instr_info
    * The function returns the length of this instruction in bytes.
    */
   char intel_syntax;
-  char intel_mnemonic;
+  bool intel_mnemonic;
   char open_char;
   char close_char;
   char separator_char;
@@ -2348,7 +2351,7 @@ static const struct dis386 dis386_twobyt
   { "ud0S",		{ Gv, Ev }, 0 },
 };
 
-static const unsigned char onebyte_has_modrm[256] = {
+static const bool onebyte_has_modrm[256] = {
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   /*       -------------------------------        */
   /* 00 */ 1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0, /* 00 */
@@ -2371,7 +2374,7 @@ static const unsigned char onebyte_has_m
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
 };
 
-static const unsigned char twobyte_has_modrm[256] = {
+static const bool twobyte_has_modrm[256] = {
   /*       0 1 2 3 4 5 6 7 8 9 a b c d e f        */
   /*       -------------------------------        */
   /* 00 */ 1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,1, /* 0f */
@@ -9029,7 +9032,7 @@ get_valid_dis386 (const struct dis386 *d
 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
 	  break;
 	}
-      ins->need_vex = 1;
+      ins->need_vex = true;
       ins->codep++;
       vindex = *ins->codep++;
       dp = &xop_table[vex_table_index][vindex];
@@ -9095,7 +9098,7 @@ get_valid_dis386 (const struct dis386 *d
 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
 	  break;
 	}
-      ins->need_vex = 1;
+      ins->need_vex = true;
       ins->codep++;
       vindex = *ins->codep++;
       dp = &vex_table[vex_table_index][vindex];
@@ -9133,7 +9136,7 @@ get_valid_dis386 (const struct dis386 *d
 	  ins->vex.prefix = REPNE_PREFIX_OPCODE;
 	  break;
 	}
-      ins->need_vex = 1;
+      ins->need_vex = true;
       ins->codep++;
       vindex = *ins->codep++;
       dp = &vex_table[dp->op[1].bytemode][vindex];
@@ -9152,13 +9155,13 @@ get_valid_dis386 (const struct dis386 *d
       if (!ins->need_vex)
 	abort ();
 
-      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w ? 1 : 0];
+      dp = &vex_w_table[dp->op[1].bytemode][ins->vex.w];
       break;
 
     case USE_EVEX_TABLE:
-      ins->two_source_ops = 0;
+      ins->two_source_ops = false;
       /* EVEX prefix.  */
-      ins->vex.evex = 1;
+      ins->vex.evex = true;
       FETCH_DATA (ins->info, ins->codep + 4);
       /* The first byte after 0x62.  */
       ins->rex = ~(*ins->codep >> 5) & 0x7;
@@ -9216,7 +9219,7 @@ get_valid_dis386 (const struct dis386 *d
 
       /* Remember the static rounding bits.  */
       ins->vex.ll = (*ins->codep >> 5) & 3;
-      ins->vex.b = (*ins->codep & 0x10) != 0;
+      ins->vex.b = *ins->codep & 0x10;
 
       ins->vex.v = *ins->codep & 0x8;
       ins->vex.mask_register_specifier = *ins->codep & 0x7;
@@ -9226,10 +9229,10 @@ get_valid_dis386 (const struct dis386 *d
 	{
 	  /* In 16/32-bit mode silently ignore following bits.  */
 	  ins->rex &= ~REX_B;
-	  ins->vex.r = 1;
+	  ins->vex.r = true;
 	}
 
-      ins->need_vex = 1;
+      ins->need_vex = true;
       ins->codep++;
       vindex = *ins->codep++;
       dp = &evex_table[vex_table_index][vindex];
@@ -9353,13 +9356,13 @@ print_insn (bfd_vma pc, instr_info *ins)
 	{
 	  ins->intel_syntax = 1;
 	  if (startswith (p + 5, "-mnemonic"))
-	    ins->intel_mnemonic = 1;
+	    ins->intel_mnemonic = true;
 	}
       else if (startswith (p, "att"))
 	{
 	  ins->intel_syntax = 0;
 	  if (startswith (p + 3, "-mnemonic"))
-	    ins->intel_mnemonic = 0;
+	    ins->intel_mnemonic = false;
 	}
       else if (startswith (p, "addr"))
 	{
@@ -9535,7 +9538,7 @@ print_insn (bfd_vma pc, instr_info *ins)
   else
     memset (&ins->modrm, 0, sizeof (ins->modrm));
 
-  ins->need_vex = 0;
+  ins->need_vex = false;
   memset (&ins->vex, 0, sizeof (ins->vex));
 
   if (dp->name == NULL && dp->op[0].bytemode == FLOATCODE)
@@ -10402,7 +10405,7 @@ putop (instr_info *ins, const char *in_t
 	    }
 	  else if (l == 1 && last[0] == 'X')
 	    {
-	      if (ins->vex.w == 0)
+	      if (!ins->vex.w)
 		*ins->obufp++ = 'h';
 	      else
 		oappend (ins, "{bad}");
@@ -10922,7 +10925,7 @@ intel_operand_size (instr_info *ins, int
 	    oappend (ins, "WORD PTR ");
 	    break;
 	  default:
-	    ins->vex.no_broadcast = 1;
+	    ins->vex.no_broadcast = true;
 	    break;
 	  }
       return;
@@ -11750,7 +11753,7 @@ OP_E_memory (instr_info *ins, int bytemo
 
       /* Broadcast can only ever be valid for memory sources.  */
       if (ins->obufp == ins->op_out[0])
-	ins->vex.no_broadcast = 1;
+	ins->vex.no_broadcast = true;
 
       if (!ins->vex.no_broadcast)
 	{
@@ -11778,7 +11781,7 @@ OP_E_memory (instr_info *ins, int bytemo
 	    }
 	  else if (bytemode == q_mode
 		   || bytemode == ymmq_mode)
-	    ins->vex.no_broadcast = 1;
+	    ins->vex.no_broadcast = true;
 	  else if (ins->vex.w
 		   || bytemode == evex_half_bcst_xmmqdh_mode
 		   || bytemode == evex_half_bcst_xmmq_mode)
@@ -11817,7 +11820,7 @@ OP_E_memory (instr_info *ins, int bytemo
 		}
 	    }
 	  else
-	    ins->vex.no_broadcast = 1;
+	    ins->vex.no_broadcast = true;
 	}
       if (ins->vex.no_broadcast)
 	oappend (ins, "{bad}");
@@ -12547,7 +12550,7 @@ OP_XMM (instr_info *ins, int bytemode, i
   if (bytemode == tmm_mode)
     ins->modrm.reg = reg;
   else if (bytemode == scalar_mode)
-    ins->vex.no_broadcast = 1;
+    ins->vex.no_broadcast = true;
 
   print_vector_reg (ins, reg, bytemode);
 }
@@ -12912,7 +12915,7 @@ OP_Mwait (instr_info *ins, int bytemode,
       strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
       if (bytemode == eBX_reg)
 	strcpy (ins->op_out[2], att_names32[3] + ins->intel_syntax);
-      ins->two_source_ops = 1;
+      ins->two_source_ops = true;
     }
   /* Skip mod/rm byte.  */
   MODRM_CHECK;
@@ -12942,7 +12945,7 @@ OP_Monitor (instr_info *ins, int bytemod
       strcpy (ins->op_out[0], names[0] + ins->intel_syntax);
       strcpy (ins->op_out[1], att_names32[1] + ins->intel_syntax);
       strcpy (ins->op_out[2], att_names32[2] + ins->intel_syntax);
-      ins->two_source_ops = 1;
+      ins->two_source_ops = true;
     }
   /* Skip mod/rm byte.  */
   MODRM_CHECK;


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 0/5] x86: adjustments to struct instr_info (and more)
  2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
                   ` (4 preceding siblings ...)
  2022-01-14 13:54 ` [PATCH 5/5] x86: adjust struct instr_info field types Jan Beulich
@ 2022-01-14 14:36 ` H.J. Lu
  5 siblings, 0 replies; 7+ messages in thread
From: H.J. Lu @ 2022-01-14 14:36 UTC (permalink / raw)
  To: Jan Beulich; +Cc: Binutils

On Fri, Jan 14, 2022 at 5:51 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> Some of this I was meaning to do for a long time, and now it (and
> further aspects) have been prompted by the thread-safety rework
>
> 1: constify disassembler static data
> 2: fold variables in memory operand index handling
> 3: drop most Intel syntax register name arrays
> 4: drop index16 field
> 5: adjust struct instr_info field types
>
> Jan
>

OK for all.

Thanks.

-- 
H.J.

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2022-01-14 14:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-14 13:51 [PATCH 0/5] x86: adjustments to struct instr_info (and more) Jan Beulich
2022-01-14 13:52 ` [PATCH 1/5] x86: constify disassembler static data Jan Beulich
2022-01-14 13:52 ` [PATCH 2/5] x86: fold variables in memory operand index handling Jan Beulich
2022-01-14 13:53 ` [PATCH 3/5] x86: drop most Intel syntax register name arrays Jan Beulich
2022-01-14 13:53 ` [PATCH 4/5] x86: drop index16 field Jan Beulich
2022-01-14 13:54 ` [PATCH 5/5] x86: adjust struct instr_info field types Jan Beulich
2022-01-14 14:36 ` [PATCH 0/5] x86: adjustments to struct instr_info (and more) H.J. Lu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).