[PATCH 1/2] x86: fold Size{16,32,64} template attributes

Jan Beulich JBeulich@suse.com
Thu Sep 13 09:44:00 GMT 2018


Only one of them can be set at a time, which means they can be expressed
by a single 2-bit field instead of three 1-bit ones.

gas/
2018-09-13  Jan Beulich  <jbeulich@suse.com>

	* config/tc-i386.c (parse_insn, process_suffix): Replace
	opcode_modifier.size<N> uses.

opcodes/
2018-09-13  Jan Beulich  <jbeulich@suse.com>

	* i386-gen.c (opcode_modifiers): Drop Size16, Size32, and
	Size64. Add Size.
	* i386-opc.h (Size16, Size32, Size64): Delete.
	(Size): New.
	(SIZE16, SIZE32, SIZE64): Define.
	(struct i386_opcode_modifier): Drop size16, size32, and size64.
	Add size.
	* i386-opc.tbl (Size16, Size32, Size64): Define.
	* i386-tbl.h: Re-generate.

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -4444,10 +4444,10 @@ parse_insn (char *line, char *mnemonic)
 	    }
 	  /* If we are in 16-bit mode, do not allow addr16 or data16.
 	     Similarly, in 32-bit mode, do not allow addr32 or data32.  */
-	  if ((current_templates->start->opcode_modifier.size16
-	       || current_templates->start->opcode_modifier.size32)
+	  if ((current_templates->start->opcode_modifier.size == SIZE16
+	       || current_templates->start->opcode_modifier.size == SIZE32)
 	      && flag_code != CODE_64BIT
-	      && (current_templates->start->opcode_modifier.size32
+	      && ((current_templates->start->opcode_modifier.size == SIZE32)
 		  ^ (flag_code == CODE_16BIT)))
 	    {
 	      as_bad (_("redundant %s prefix"),
@@ -6039,11 +6039,11 @@ process_suffix (void)
 {
   /* If matched instruction specifies an explicit instruction mnemonic
      suffix, use it.  */
-  if (i.tm.opcode_modifier.size16)
+  if (i.tm.opcode_modifier.size == SIZE16)
     i.suffix = WORD_MNEM_SUFFIX;
-  else if (i.tm.opcode_modifier.size32)
+  else if (i.tm.opcode_modifier.size == SIZE32)
     i.suffix = LONG_MNEM_SUFFIX;
-  else if (i.tm.opcode_modifier.size64)
+  else if (i.tm.opcode_modifier.size == SIZE64)
     i.suffix = QWORD_MNEM_SUFFIX;
   else if (i.reg_operands)
     {
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -612,9 +612,7 @@ static bitfield opcode_modifiers[] =
   BITFIELD (JumpInterSegment),
   BITFIELD (FloatMF),
   BITFIELD (FloatR),
-  BITFIELD (Size16),
-  BITFIELD (Size32),
-  BITFIELD (Size64),
+  BITFIELD (Size),
   BITFIELD (CheckRegSize),
   BITFIELD (IgnoreSize),
   BITFIELD (DefaultSize),
--- a/opcodes/i386-opc.h
+++ b/opcodes/i386-opc.h
@@ -399,11 +399,12 @@ enum
   /* src/dest swap for floats. */
   FloatR,
   /* needs size prefix if in 32-bit mode */
-  Size16,
+#define SIZE16 1
   /* needs size prefix if in 16-bit mode */
-  Size32,
+#define SIZE32 2
   /* needs size prefix if in 64-bit mode */
-  Size64,
+#define SIZE64 3
+  Size,
   /* check register size.  */
   CheckRegSize,
   /* instruction ignores operand size prefix and in Intel mode ignores
@@ -625,9 +626,7 @@ typedef struct i386_opcode_modifier
   unsigned int jumpintersegment:1;
   unsigned int floatmf:1;
   unsigned int floatr:1;
-  unsigned int size16:1;
-  unsigned int size32:1;
-  unsigned int size64:1;
+  unsigned int size:2;
   unsigned int checkregsize:1;
   unsigned int ignoresize:1;
   unsigned int defaultsize:1;
--- a/opcodes/i386-opc.tbl
+++ b/opcodes/i386-opc.tbl
@@ -22,6 +22,10 @@
 #include "i386-opc.h"
 #undef None
 
+#define Size16 Size=SIZE16
+#define Size32 Size=SIZE32
+#define Size64 Size=SIZE64
+
 ### MARKER ###
 
 // Move instructions.






More information about the Binutils mailing list