x86/Intel: drop LONG_DOUBLE_MNEM_SUFFIX
authorJan Beulich <jbeulich@suse.com>
Thu, 1 Dec 2022 08:59:39 +0000 (09:59 +0100)
committerJan Beulich <jbeulich@suse.com>
Thu, 1 Dec 2022 08:59:39 +0000 (09:59 +0100)
With the removal of its use for FPU insns the suffix is now finally
properly misnamed. Drop its use altogether, replacing it by a separate
boolean instead.

gas/config/tc-i386-intel.c
gas/config/tc-i386.c
opcodes/i386-opc.tbl
opcodes/i386-tbl.h

index 650a24bc00bea3dc3412b61c3446d020145c83e1..54b124be9c63089834597f50ce767f8de162026b 100644 (file)
@@ -715,8 +715,10 @@ i386_intel_operand (char *operand_string, int got_a_float)
                   && (current_templates->start->opcode_modifier.jump == JUMP
                       || current_templates->start->opcode_modifier.jump
                          == JUMP_DWORD))
-           suffix = flag_code == CODE_16BIT ? LONG_DOUBLE_MNEM_SUFFIX
-                                            : WORD_MNEM_SUFFIX;
+           {
+             i.far_branch = true;
+             suffix = WORD_MNEM_SUFFIX;
+           }
          else if (got_a_float == 1)    /* "f..." */
            suffix = SHORT_MNEM_SUFFIX;
          else
@@ -733,7 +735,7 @@ i386_intel_operand (char *operand_string, int got_a_float)
            {
              if (flag_code == CODE_16BIT)
                add_prefix (DATA_PREFIX_OPCODE);
-             suffix = LONG_DOUBLE_MNEM_SUFFIX;
+             i.far_branch = true;
            }
          break;
 
@@ -774,7 +776,7 @@ i386_intel_operand (char *operand_string, int got_a_float)
          break;
 
        case O_far_ptr:
-         suffix = LONG_DOUBLE_MNEM_SUFFIX;
+         i.far_branch = true;
          /* FALLTHROUGH */
        case O_near_ptr:
          if (current_templates->start->opcode_modifier.jump != JUMP
@@ -833,10 +835,6 @@ i386_intel_operand (char *operand_string, int got_a_float)
                  if (t->opcode_modifier.no_ssuf)
                    continue;
                  break;
-               case LONG_DOUBLE_MNEM_SUFFIX:
-                 if (t->opcode_modifier.no_ldsuf)
-                   continue;
-                 break;
                default:
                  abort ();
                }
@@ -916,7 +914,11 @@ i386_intel_operand (char *operand_string, int got_a_float)
                return 0;
              }
            else if (S_GET_SEGMENT (intel_state.seg) == reg_section)
-             jumpabsolute = true;
+             {
+               jumpabsolute = true;
+               if (intel_state.op_modifier == O_far_ptr)
+                 i.far_branch = true;
+             }
            else
              {
                i386_operand_type types;
@@ -943,8 +945,6 @@ i386_intel_operand (char *operand_string, int got_a_float)
                    this_operand = i.operands++;
                    i.types[this_operand].bitfield.unspecified = 1;
                  }
-               if (suffix == LONG_DOUBLE_MNEM_SUFFIX)
-                 i.suffix = 0;
                intel_state.seg = NULL;
                intel_state.is_mem = 0;
              }
index 874cf17867366ce05c62c32cf58b0f21a435d4b5..1a458924d61c194887fe01ff69fc00a66720a791 100644 (file)
@@ -80,9 +80,6 @@
 #define SHORT_MNEM_SUFFIX 's'
 #define LONG_MNEM_SUFFIX  'l'
 #define QWORD_MNEM_SUFFIX  'q'
-/* Intel Syntax.  Use a non-ascii letter since since it never appears
-   in instructions.  */
-#define LONG_DOUBLE_MNEM_SUFFIX '\1'
 
 #define END_OF_INSN '\0'
 
@@ -313,6 +310,9 @@ struct _i386_insn
     /* The operand to a branch insn indicates an absolute branch.  */
     bool jumpabsolute;
 
+    /* The operand to a branch insn indicates a far branch.  */
+    bool far_branch;
+
     /* There is a memory operand of (%dx) which should be only used
        with input/output instructions.  */
     bool input_output_operand;
@@ -6494,14 +6494,6 @@ match_template (char mnem_suffix)
     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;
     }
 
   for (t = current_templates->start; t < current_templates->end; t++)
@@ -6555,8 +6547,7 @@ match_template (char mnem_suffix)
          || (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))
+         || (t->opcode_modifier.no_qsuf && suffix_check.no_qsuf))
        continue;
 
       specific_error = progress (operand_size_mismatch);
@@ -6574,6 +6565,15 @@ match_template (char mnem_suffix)
       if (i.jumpabsolute && t->opcode_modifier.jump != JUMP_ABSOLUTE)
        continue;
 
+      /* 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.  Skip the "near" one
+        (permitting a register operand) when "far" was requested.  */
+      if (i.far_branch
+         && t->opcode_modifier.jump == JUMP_ABSOLUTE
+         && t->operand_types[0].bitfield.class == Reg)
+       continue;
+
       for (j = 0; j < MAX_OPERANDS; j++)
        operand_types[j] = t->operand_types[j];
 
index 390491ef0cdc4bc694676141496ba431da3b913a..555f6d0429ec791e461ef92592819ad6c424a46a 100644 (file)
@@ -434,7 +434,7 @@ call, 0xff, 2, Cpu64, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_lSuf|No_sS
 call, 0xff, 2, Cpu64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex }
 // Intel Syntax remaining call instances.
 call, 0x9a, None, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
-call, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf, { Dword|Fword|BaseIndex }
+call, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|NoSuf, { Dword|Fword|BaseIndex }
 call, 0xff, 3, Cpu64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex }
 lcall, 0x9a, None, CpuNo64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
 lcall, 0xff, 3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex }
@@ -447,7 +447,7 @@ jmp, 0xff, 4, Cpu64, Amd64|Modrm|JumpAbsolute|No_bSuf|No_lSuf|No_sSuf|No_ldSuf|N
 jmp, 0xff, 4, Cpu64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex }
 // Intel Syntax remaining jmp instances.
 jmp, 0xea, None, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
-jmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf, { Dword|Fword|BaseIndex }
+jmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|BaseIndex }
 jmp, 0xff, 5, Cpu64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex }
 ljmp, 0xea, None, CpuNo64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm16, Imm16|Imm32 }
 ljmp, 0xff, 5, 0, Amd64|Modrm|JumpAbsolute|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex }
index 752478b28e36bee1c506a32f532358f446f5a58f..43ecdf3bbd86474dad06625e455fe75a6bb99d7c 100644 (file)
@@ -3143,7 +3143,7 @@ const insn_template i386_optab[] =
       { { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 0, 0, 0 } } } },
   { "call", 0xff, 1, 3,
-    { 0, 0, 0, 1, 5, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    { 0, 0, 0, 1, 5, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1 },
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
@@ -3290,7 +3290,7 @@ const insn_template i386_optab[] =
       { { 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
          0, 0, 0, 0, 0, 0 } } } },
   { "jmp", 0xff, 1, 5,
-    { 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+    { 0, 0, 0, 1, 5, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 1 },
     { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,