x86: fold EsSeg into IsString
[binutils-gdb.git] / gas / config / tc-i386.c
index 20cd1adf85ba9f4b3de24275863e65beab00d1f2..c55904165a4b6b7c1ceb5cb1c84371aced7e7d7b 100644 (file)
@@ -1613,6 +1613,7 @@ operand_type_set (union i386_operand_type *x, unsigned int v)
     }
 
   x->bitfield.class = ClassNone;
+  x->bitfield.instance = InstanceNone;
 }
 
 static INLINE int
@@ -1829,6 +1830,8 @@ operand_type_and (i386_operand_type x, i386_operand_type y)
 {
   if (x.bitfield.class != y.bitfield.class)
     x.bitfield.class = ClassNone;
+  if (x.bitfield.instance != y.bitfield.instance)
+    x.bitfield.instance = InstanceNone;
 
   switch (ARRAY_SIZE (x.array))
     {
@@ -1851,6 +1854,7 @@ static INLINE i386_operand_type
 operand_type_and_not (i386_operand_type x, i386_operand_type y)
 {
   gas_assert (y.bitfield.class == ClassNone);
+  gas_assert (y.bitfield.instance == InstanceNone);
 
   switch (ARRAY_SIZE (x.array))
     {
@@ -1875,6 +1879,9 @@ operand_type_or (i386_operand_type x, i386_operand_type y)
   gas_assert (x.bitfield.class == ClassNone ||
               y.bitfield.class == ClassNone ||
               x.bitfield.class == y.bitfield.class);
+  gas_assert (x.bitfield.instance == InstanceNone ||
+              y.bitfield.instance == InstanceNone ||
+              x.bitfield.instance == y.bitfield.instance);
 
   switch (ARRAY_SIZE (x.array))
     {
@@ -1897,6 +1904,7 @@ static INLINE i386_operand_type
 operand_type_xor (i386_operand_type x, i386_operand_type y)
 {
   gas_assert (y.bitfield.class == ClassNone);
+  gas_assert (y.bitfield.instance == InstanceNone);
 
   switch (ARRAY_SIZE (x.array))
     {
@@ -2084,7 +2092,7 @@ operand_size_match (const insn_template *t)
          break;
        }
 
-      if (t->operand_types[j].bitfield.acc
+      if (t->operand_types[j].bitfield.instance == Accum
          && (!match_operand_size (t, j, j) || !match_simd_size (t, j, j)))
        {
          match = 0;
@@ -2121,7 +2129,7 @@ mismatch:
          && !match_simd_size (t, j, given))
        goto mismatch;
 
-      if (t->operand_types[j].bitfield.acc
+      if (t->operand_types[j].bitfield.instance == Accum
          && (!match_operand_size (t, j, given)
              || !match_simd_size (t, j, given)))
        goto mismatch;
@@ -3153,7 +3161,6 @@ const type_names[] =
   { OPERAND_TYPE_REGYMM, "rYMM" },
   { OPERAND_TYPE_REGZMM, "rZMM" },
   { OPERAND_TYPE_REGMASK, "Mask reg" },
-  { OPERAND_TYPE_ESSEG, "es" },
 };
 
 static void
@@ -3842,52 +3849,6 @@ process_immext (void)
 {
   expressionS *exp;
 
-  if ((i.tm.cpu_flags.bitfield.cpusse3 || i.tm.cpu_flags.bitfield.cpusvme)
-      && i.operands > 0)
-    {
-      /* MONITOR/MWAIT as well as SVME instructions have fixed operands
-        with an opcode suffix which is coded in the same place as an
-        8-bit immediate field would be.
-        Here we check those operands and remove them afterwards.  */
-      unsigned int x;
-
-      for (x = 0; x < i.operands; x++)
-       if (register_number (i.op[x].regs) != x)
-         as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
-                 register_prefix, i.op[x].regs->reg_name, x + 1,
-                 i.tm.name);
-
-      i.operands = 0;
-    }
-
-  if (i.tm.cpu_flags.bitfield.cpumwaitx && i.operands > 0)
-    {
-      /* MONITORX/MWAITX instructions have fixed operands with an opcode
-        suffix which is coded in the same place as an 8-bit immediate
-        field would be.
-        Here we check those operands and remove them afterwards.  */
-      unsigned int x;
-
-      if (i.operands != 3)
-       abort();
-
-      for (x = 0; x < 2; x++)
-       if (register_number (i.op[x].regs) != x)
-         goto bad_register_operand;
-
-      /* Check for third operand for mwaitx/monitorx insn.  */
-      if (register_number (i.op[x].regs)
-         != (x + (i.tm.extension_opcode == 0xfb)))
-       {
-bad_register_operand:
-         as_bad (_("can't use register '%s%s' as operand %d in '%s'."),
-                 register_prefix, i.op[x].regs->reg_name, x+1,
-                 i.tm.name);
-       }
-
-      i.operands = 0;
-    }
-
   /* These AMD 3DNow! and SSE2 instructions have an opcode suffix
      which is coded in the same place as an 8-bit immediate field
      would be.  Here we fake an 8-bit immediate operand from the
@@ -4154,7 +4115,7 @@ optimize_encoding (void)
          else
            return;
        }
-      else if (i.tm.operand_types[0].bitfield.regmask)
+      else if (i.tm.operand_types[0].bitfield.class == RegMask)
        {
          i.tm.base_opcode &= 0xff;
          i.tm.opcode_modifier.vexw = VEXW0;
@@ -4424,8 +4385,9 @@ md_assemble (char *line)
     }
 
   /* Check string instruction segment overrides.  */
-  if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
+  if (i.tm.opcode_modifier.isstring >= IS_STRING_ES_OP0)
     {
+      gas_assert (i.mem_operands);
       if (!check_string ())
        return;
       i.disp_operands = 0;
@@ -4453,9 +4415,8 @@ md_assemble (char *line)
      with 3 operands or less.  */
   if (i.operands <= 3)
     for (j = 0; j < i.operands; j++)
-      if (i.types[j].bitfield.inoutportreg
-         || i.types[j].bitfield.shiftcount
-         || (i.types[j].bitfield.acc && !i.types[j].bitfield.xmmword))
+      if (i.types[j].bitfield.instance != InstanceNone
+         && !i.types[j].bitfield.xmmword)
        i.reg_operands--;
 
   /* ImmExt should be processed after SSE2AVX.  */
@@ -5076,9 +5037,9 @@ optimize_imm (void)
   else if (i.reg_operands)
     {
       /* Figure out a suffix from the last register operand specified.
-        We can't do this properly yet, ie. excluding InOutPortReg,
-        but the following works for instructions with immediates.
-        In any case, we can't set i.suffix yet.  */
+        We can't do this properly yet, i.e. excluding special register
+        instances, but the following works for instructions with
+        immediates.  In any case, we can't set i.suffix yet.  */
       for (op = i.operands; --op >= 0;)
        if (i.types[op].bitfield.class != Reg)
          continue;
@@ -5693,7 +5654,7 @@ match_template (char mnem_suffix)
   i386_operand_type overlap0, overlap1, overlap2, overlap3;
   i386_operand_type overlap4;
   unsigned int found_reverse_match;
-  i386_opcode_modifier suffix_check, mnemsuf_check;
+  i386_opcode_modifier suffix_check;
   i386_operand_type operand_types [MAX_OPERANDS];
   int addr_prefix_disp;
   unsigned int j;
@@ -5708,33 +5669,33 @@ match_template (char mnem_suffix)
   found_reverse_match = 0;
   addr_prefix_disp = -1;
 
+  /* Prepare for mnemonic suffix check.  */
   memset (&suffix_check, 0, sizeof (suffix_check));
-  if (intel_syntax && i.broadcast)
-    /* nothing */;
-  else if (i.suffix == BYTE_MNEM_SUFFIX)
-    suffix_check.no_bsuf = 1;
-  else if (i.suffix == WORD_MNEM_SUFFIX)
-    suffix_check.no_wsuf = 1;
-  else if (i.suffix == SHORT_MNEM_SUFFIX)
-    suffix_check.no_ssuf = 1;
-  else if (i.suffix == LONG_MNEM_SUFFIX)
-    suffix_check.no_lsuf = 1;
-  else if (i.suffix == QWORD_MNEM_SUFFIX)
-    suffix_check.no_qsuf = 1;
-  else if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
-    suffix_check.no_ldsuf = 1;
-
-  memset (&mnemsuf_check, 0, sizeof (mnemsuf_check));
-  if (intel_syntax)
+  switch (mnem_suffix)
     {
-      switch (mnem_suffix)
-       {
-       case BYTE_MNEM_SUFFIX:  mnemsuf_check.no_bsuf = 1; break;
-       case WORD_MNEM_SUFFIX:  mnemsuf_check.no_wsuf = 1; break;
-       case SHORT_MNEM_SUFFIX: mnemsuf_check.no_ssuf = 1; break;
-       case LONG_MNEM_SUFFIX:  mnemsuf_check.no_lsuf = 1; break;
-       case QWORD_MNEM_SUFFIX: mnemsuf_check.no_qsuf = 1; break;
-       }
+    case BYTE_MNEM_SUFFIX:
+      suffix_check.no_bsuf = 1;
+      break;
+    case WORD_MNEM_SUFFIX:
+      suffix_check.no_wsuf = 1;
+      break;
+    case SHORT_MNEM_SUFFIX:
+      suffix_check.no_ssuf = 1;
+      break;
+    case LONG_MNEM_SUFFIX:
+      suffix_check.no_lsuf = 1;
+      break;
+    case QWORD_MNEM_SUFFIX:
+      suffix_check.no_qsuf = 1;
+      break;
+    default:
+      /* NB: In Intel syntax, normally we can check for memory operand
+        size when there is no mnemonic suffix.  But jmp and call have
+        2 different encodings with Dword memory operand size, one with
+        No_ldSuf and the other without.  i.suffix is set to
+        LONG_DOUBLE_MNEM_SUFFIX to skip the one with No_ldSuf.  */
+      if (i.suffix == LONG_DOUBLE_MNEM_SUFFIX)
+       suffix_check.no_ldsuf = 1;
     }
 
   /* Must have right number of operands.  */
@@ -5768,23 +5729,14 @@ match_template (char mnem_suffix)
          || (!intel64 && t->opcode_modifier.intel64))
        continue;
 
-      /* Check the suffix, except for some instructions in intel mode.  */
+      /* Check the suffix.  */
       i.error = invalid_instruction_suffix;
-      if ((!intel_syntax || !t->opcode_modifier.ignoresize)
-         && ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
-             || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
-             || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
-             || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
-             || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
-             || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf)))
-       continue;
-      /* In Intel mode all mnemonic suffixes must be explicitly allowed.  */
-      if ((t->opcode_modifier.no_bsuf && mnemsuf_check.no_bsuf)
-         || (t->opcode_modifier.no_wsuf && mnemsuf_check.no_wsuf)
-         || (t->opcode_modifier.no_lsuf && mnemsuf_check.no_lsuf)
-         || (t->opcode_modifier.no_ssuf && mnemsuf_check.no_ssuf)
-         || (t->opcode_modifier.no_qsuf && mnemsuf_check.no_qsuf)
-         || (t->opcode_modifier.no_ldsuf && mnemsuf_check.no_ldsuf))
+      if ((t->opcode_modifier.no_bsuf && suffix_check.no_bsuf)
+         || (t->opcode_modifier.no_wsuf && suffix_check.no_wsuf)
+         || (t->opcode_modifier.no_lsuf && suffix_check.no_lsuf)
+         || (t->opcode_modifier.no_ssuf && suffix_check.no_ssuf)
+         || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf)
+         || (t->opcode_modifier.no_ldsuf && suffix_check.no_ldsuf))
        continue;
 
       size_match = operand_size_match (t);
@@ -5906,15 +5858,17 @@ match_template (char mnem_suffix)
             zero-extend %eax to %rax.  */
          if (flag_code == CODE_64BIT
              && t->base_opcode == 0x90
-             && i.types[0].bitfield.acc && i.types[0].bitfield.dword
-             && i.types[1].bitfield.acc && i.types[1].bitfield.dword)
+             && i.types[0].bitfield.instance == Accum
+             && i.types[0].bitfield.dword
+             && i.types[1].bitfield.instance == Accum
+             && i.types[1].bitfield.dword)
            continue;
          /* xrelease mov %eax, <disp> is another special case. It must not
             match the accumulator-only encoding of mov.  */
          if (flag_code != CODE_64BIT
              && i.hle_prefix
              && t->base_opcode == 0xa0
-             && i.types[0].bitfield.acc
+             && i.types[0].bitfield.instance == Accum
              && (i.flags[1] & Operand_Mem))
            continue;
          /* Fall through.  */
@@ -6214,35 +6168,24 @@ check_reverse:
 static int
 check_string (void)
 {
-  unsigned int mem_op = i.flags[0] & Operand_Mem ? 0 : 1;
+  unsigned int es_op = i.tm.opcode_modifier.isstring - IS_STRING_ES_OP0;
+  unsigned int op = i.tm.operand_types[0].bitfield.baseindex ? es_op : 0;
 
-  if (i.tm.operand_types[mem_op].bitfield.esseg)
+  if (i.seg[op] != NULL && i.seg[op] != &es)
     {
-      if (i.seg[0] != NULL && i.seg[0] != &es)
-       {
-         as_bad (_("`%s' operand %d must use `%ses' segment"),
-                 i.tm.name,
-                 intel_syntax ? i.tm.operands - mem_op : mem_op + 1,
-                 register_prefix);
-         return 0;
-       }
-      /* There's only ever one segment override allowed per instruction.
-        This instruction possibly has a legal segment override on the
-        second operand, so copy the segment to where non-string
-        instructions store it, allowing common code.  */
-      i.seg[0] = i.seg[1];
-    }
-  else if (i.tm.operand_types[mem_op + 1].bitfield.esseg)
-    {
-      if (i.seg[1] != NULL && i.seg[1] != &es)
-       {
-         as_bad (_("`%s' operand %d must use `%ses' segment"),
-                 i.tm.name,
-                 intel_syntax ? i.tm.operands - mem_op - 1 : mem_op + 2,
-                 register_prefix);
-         return 0;
-       }
+      as_bad (_("`%s' operand %u must use `%ses' segment"),
+             i.tm.name,
+             intel_syntax ? i.tm.operands - es_op : es_op + 1,
+             register_prefix);
+      return 0;
     }
+
+  /* There's only ever one segment override allowed per instruction.
+     This instruction possibly has a legal segment override on the
+     second operand, so copy the segment to where non-string
+     instructions store it, allowing common code.  */
+  i.seg[op] = i.seg[1];
+
   return 1;
 }
 
@@ -6293,8 +6236,8 @@ process_suffix (void)
                }
 
              for (op = i.operands; --op >= 0;)
-               if (!i.tm.operand_types[op].bitfield.inoutportreg
-                   && !i.tm.operand_types[op].bitfield.shiftcount)
+               if (i.tm.operand_types[op].bitfield.instance == InstanceNone
+                   || i.tm.operand_types[op].bitfield.instance == Accum)
                  {
                    if (i.types[op].bitfield.class != Reg)
                      continue;
@@ -6473,7 +6416,7 @@ process_suffix (void)
       if (i.reg_operands > 0
          && i.types[0].bitfield.class == Reg
          && i.tm.opcode_modifier.addrprefixopreg
-         && (i.tm.opcode_modifier.immext
+         && (i.tm.operand_types[0].bitfield.instance == Accum
              || i.operands == 1))
        {
          /* The address size override prefix changes the size of the
@@ -6511,8 +6454,10 @@ process_suffix (void)
          && ! (i.operands == 2
                && i.tm.base_opcode == 0x90
                && i.tm.extension_opcode == None
-               && i.types[0].bitfield.acc && i.types[0].bitfield.qword
-               && i.types[1].bitfield.acc && i.types[1].bitfield.qword))
+               && i.types[0].bitfield.instance == Accum
+               && i.types[0].bitfield.qword
+               && i.types[1].bitfield.instance == Accum
+               && i.types[1].bitfield.qword))
        i.rex |= REX_W;
 
       break;
@@ -6521,7 +6466,7 @@ process_suffix (void)
   if (i.reg_operands != 0
       && i.operands > 1
       && i.tm.opcode_modifier.addrprefixopreg
-      && !i.tm.opcode_modifier.immext)
+      && i.tm.operand_types[0].bitfield.instance != Accum)
     {
       /* Check invalid register operand when the address size override
         prefix changes the size of register operands.  */
@@ -6574,7 +6519,8 @@ check_byte_reg (void)
        continue;
 
       /* I/O port address operands are OK too.  */
-      if (i.tm.operand_types[op].bitfield.inoutportreg)
+      if (i.tm.operand_types[op].bitfield.instance == RegD
+         && i.tm.operand_types[op].bitfield.word)
        continue;
 
       /* crc32 doesn't generate this warning.  */
@@ -6635,7 +6581,7 @@ check_long_reg (void)
        them. (eg. movzb)  */
     else if (i.types[op].bitfield.byte
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && (i.tm.operand_types[op].bitfield.word
                 || i.tm.operand_types[op].bitfield.dword))
       {
@@ -6650,7 +6596,7 @@ check_long_reg (void)
     else if ((!quiet_warnings || flag_code == CODE_64BIT)
             && i.types[op].bitfield.word
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.dword)
       {
        /* Prohibit these changes in the 64bit mode, since the
@@ -6672,7 +6618,7 @@ check_long_reg (void)
     /* Warn if the r prefix on a general reg is present.  */
     else if (i.types[op].bitfield.qword
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.dword)
       {
        if (intel_syntax
@@ -6706,7 +6652,7 @@ check_qword_reg (void)
        them. (eg. movzb)  */
     else if (i.types[op].bitfield.byte
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && (i.tm.operand_types[op].bitfield.word
                 || i.tm.operand_types[op].bitfield.dword))
       {
@@ -6721,7 +6667,7 @@ check_qword_reg (void)
     else if ((i.types[op].bitfield.word
              || i.types[op].bitfield.dword)
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.qword)
       {
        /* Prohibit these changes in the 64bit mode, since the
@@ -6756,7 +6702,7 @@ check_word_reg (void)
        them. (eg. movzb)  */
     else if (i.types[op].bitfield.byte
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && (i.tm.operand_types[op].bitfield.word
                 || i.tm.operand_types[op].bitfield.dword))
       {
@@ -6772,7 +6718,7 @@ check_word_reg (void)
             && (i.types[op].bitfield.dword
                 || i.types[op].bitfield.qword)
             && (i.tm.operand_types[op].bitfield.class == Reg
-                || i.tm.operand_types[op].bitfield.acc)
+                || i.tm.operand_types[op].bitfield.instance == Accum)
             && i.tm.operand_types[op].bitfield.word)
       {
        /* Prohibit these changes in the 64bit mode, since the
@@ -6897,14 +6843,14 @@ process_operands (void)
                  && MAX_OPERANDS > dupl
                  && operand_type_equal (&i.types[dest], &regxmm));
 
-      if (i.tm.operand_types[0].bitfield.acc
+      if (i.tm.operand_types[0].bitfield.instance == Accum
          && i.tm.operand_types[0].bitfield.xmmword)
        {
          if (i.tm.opcode_modifier.vexsources == VEX3SOURCES)
            {
              /* Keep xmm0 for instructions with VEX prefix and 3
                 sources.  */
-             i.tm.operand_types[0].bitfield.acc = 0;
+             i.tm.operand_types[0].bitfield.instance = InstanceNone;
              i.tm.operand_types[0].bitfield.class = RegSIMD;
              goto duplicate;
            }
@@ -6969,7 +6915,7 @@ duplicate:
        if (i.tm.opcode_modifier.immext)
         process_immext ();
     }
-  else if (i.tm.operand_types[0].bitfield.acc
+  else if (i.tm.operand_types[0].bitfield.instance == Accum
           && i.tm.operand_types[0].bitfield.xmmword)
     {
       unsigned int j;
@@ -7216,9 +7162,11 @@ build_modrm_byte (void)
          gas_assert (i.imm_operands == 1
                      || (i.imm_operands == 0
                          && (i.tm.opcode_modifier.vexvvvv == VEXXDS
-                             || i.types[0].bitfield.shiftcount)));
+                             || (i.types[0].bitfield.instance == RegC
+                                 && i.types[0].bitfield.byte))));
          if (operand_type_check (i.types[0], imm)
-             || i.types[0].bitfield.shiftcount)
+             || (i.types[0].bitfield.instance == RegC
+                 && i.types[0].bitfield.byte))
            source = 1;
          else
            source = 0;
@@ -7682,8 +7630,8 @@ build_modrm_byte (void)
          for (op = 0; op < i.operands; op++)
            {
              if (i.types[op].bitfield.class == Reg
-                 || i.types[op].bitfield.regbnd
-                 || i.types[op].bitfield.regmask
+                 || i.types[op].bitfield.class == RegBND
+                 || i.types[op].bitfield.class == RegMask
                  || i.types[op].bitfield.class == SReg
                  || i.types[op].bitfield.class == RegCR
                  || i.types[op].bitfield.class == RegDR
@@ -9238,7 +9186,7 @@ check_VecOperations (char *op_string, char *op_end)
          else if ((mask = parse_register (op_string, &end_op)) != NULL)
            {
              /* k0 can't be used for write mask.  */
-             if (!mask->reg_type.bitfield.regmask || mask->reg_num == 0)
+             if (mask->reg_type.bitfield.class != RegMask || !mask->reg_num)
                {
                  as_bad (_("`%s%s' can't be used for write mask"),
                          register_prefix, mask->reg_name);
@@ -9821,16 +9769,16 @@ i386_index_check (const char *operand_string)
 
       if (current_templates->start->opcode_modifier.repprefixok)
        {
-         i386_operand_type type = current_templates->end[-1].operand_types[0];
+         int es_op = current_templates->end[-1].opcode_modifier.isstring
+                     - IS_STRING_ES_OP0;
+         int op = 0;
 
-         if (!type.bitfield.baseindex
+         if (!current_templates->end[-1].operand_types[0].bitfield.baseindex
              || ((!i.mem_operands != !intel_syntax)
                  && current_templates->end[-1].operand_types[1]
                     .bitfield.baseindex))
-           type = current_templates->end[-1].operand_types[1];
-         expected_reg = hash_find (reg_hash,
-                                   di_si[addr_mode][type.bitfield.esseg]);
-
+           op = 1;
+         expected_reg = hash_find (reg_hash, di_si[addr_mode][op == es_op]);
        }
       else
        expected_reg = hash_find (reg_hash, bx[addr_mode]);
@@ -10329,7 +10277,8 @@ i386_att_operand (char *operand_string)
 
       /* Special case for (%dx) while doing input/output op.  */
       if (i.base_reg
-         && i.base_reg->reg_type.bitfield.inoutportreg
+         && i.base_reg->reg_type.bitfield.instance == RegD
+         && i.base_reg->reg_type.bitfield.word
          && i.index_reg == 0
          && i.log2_scale_factor == 0
          && i.seg[i.mem_operands] == 0
@@ -10935,7 +10884,8 @@ parse_real_register (char *reg_string, char **end_op)
 
   if (!cpu_arch_flags.bitfield.cpuavx512f)
     {
-      if (r->reg_type.bitfield.zmmword || r->reg_type.bitfield.regmask)
+      if (r->reg_type.bitfield.zmmword
+         || r->reg_type.bitfield.class == RegMask)
        return (const reg_entry *) NULL;
 
       if (!cpu_arch_flags.bitfield.cpuavx)
@@ -10948,7 +10898,7 @@ parse_real_register (char *reg_string, char **end_op)
        }
     }
 
-  if (r->reg_type.bitfield.regbnd && !cpu_arch_flags.bitfield.cpumpx)
+  if (r->reg_type.bitfield.class == RegBND && !cpu_arch_flags.bitfield.cpumpx)
     return (const reg_entry *) NULL;
 
   /* Don't allow fake index register unless allow_index_reg isn't 0. */