[3/3] x86: clean up after removal of support for gcc <= 2.8.1

Message ID 5dd8b2df-62f2-a551-4b35-f3df66d57e04@suse.com
State Accepted
Headers
Series x86: FPU insn handling simplifications |

Checks

Context Check Description
snail/binutils-gdb-check success Github commit url

Commit Message

Jan Beulich Nov. 24, 2022, 8:58 a.m. UTC
  At the very least a comment in process_operands() is stale. Beyond that
there are effectively two options:
1) It is possible that FADDP and FMULP were mistakenly not marked as
   being in need of dealing with the compiler anomaly, and hence the
   respective templates weren't removed at the time when they should
   have been.
2) It is also possible that there are indeed uses known beyond compiler
   generated output for these two commutative opcodes, and hence the
   templates need to stay.
To be on the safe side assume 2: Update the comment and fold the
templates into their "normal" ones (utilizing D), adjusting consuming
code accordingly.

For FMULP also add a comment paralleling a similar one FADDP has.
  

Comments

H.J. Lu Nov. 28, 2022, 11:21 p.m. UTC | #1
On Thu, Nov 24, 2022 at 12:58 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> At the very least a comment in process_operands() is stale. Beyond that
> there are effectively two options:
> 1) It is possible that FADDP and FMULP were mistakenly not marked as
>    being in need of dealing with the compiler anomaly, and hence the
>    respective templates weren't removed at the time when they should
>    have been.
> 2) It is also possible that there are indeed uses known beyond compiler
>    generated output for these two commutative opcodes, and hence the
>    templates need to stay.
> To be on the safe side assume 2: Update the comment and fold the
> templates into their "normal" ones (utilizing D), adjusting consuming
> code accordingly.
>
> For FMULP also add a comment paralleling a similar one FADDP has.

Please mention dropping GCC 2.8.1 support in gas/NEWS.

> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -6806,7 +6806,8 @@ match_template (char mnem_suffix)
>                 found_reverse_match = 0;
>               else if (operand_types[0].bitfield.tbyte)
>                 {
> -                 found_reverse_match = Opcode_FloatD;
> +                 if (t->opcode_modifier.operandconstraint != UGH)
> +                   found_reverse_match = Opcode_FloatD;
>                   /* FSUB{,R} and FDIV{,R} may need a 2nd bit flipped.  */
>                   if ((t->base_opcode & 0x20)
>                       && (intel_syntax || intel_mnemonic))
> @@ -7997,29 +7998,31 @@ process_operands (void)
>      {
>        /* The register or float register operand is in operand
>          0 or 1.  */
> -      unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
> +      const reg_entry *r = i.op[0].regs;
>
> +      if (i.imm_operands
> +         || (r->reg_type.bitfield.instance == Accum && i.op[1].regs))
> +       r = i.op[1].regs;
>        /* Register goes in low 3 bits of opcode.  */
> -      i.tm.base_opcode |= i.op[op].regs->reg_num;
> -      if ((i.op[op].regs->reg_flags & RegRex) != 0)
> +      i.tm.base_opcode |= r->reg_num;
> +      if ((r->reg_flags & RegRex) != 0)
>         i.rex |= REX_B;
>        if (!quiet_warnings && i.tm.opcode_modifier.operandconstraint == UGH)
>         {
> -         /* Warn about some common errors, but press on regardless.
> -            The first case can be generated by gcc (<= 2.8.1).  */
> -         if (i.operands == 2)
> -           {
> -             /* Reversed arguments on faddp, fsubp, etc.  */
> -             as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
> -                      register_prefix, i.op[!intel_syntax].regs->reg_name,
> -                      register_prefix, i.op[intel_syntax].regs->reg_name);
> -           }
> -         else
> +         /* Warn about some common errors, but press on regardless.  */
> +         if (i.operands != 2)
>             {
>               /* Extraneous `l' suffix on fp insn.  */
>               as_warn (_("translating to `%s %s%s'"), i.tm.name,
>                        register_prefix, i.op[0].regs->reg_name);
>             }
> +         else if (i.op[0].regs->reg_type.bitfield.instance != Accum)
> +           {
> +             /* Reversed arguments on faddp or fmulp.  */
> +             as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
> +                      register_prefix, i.op[!intel_syntax].regs->reg_name,
> +                      register_prefix, i.op[intel_syntax].regs->reg_name);
> +           }
>         }
>      }
>
> --- a/opcodes/i386-opc.tbl
> +++ b/opcodes/i386-opc.tbl
> @@ -686,11 +686,10 @@ fadd, 0xdec1, None, CpuFP, NoSuf|Ugh|ATT
>  fadd, 0xd8, 0, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Dword|Qword|Unspecified|BaseIndex }
>  fiadd, 0xde, 0, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Word|Dword|Unspecified|BaseIndex }
>
> -faddp, 0xdec0, None, CpuFP, NoSuf, { FloatAcc, FloatReg }
> +faddp, 0xdec0, None, CpuFP, D|NoSuf|Ugh, { FloatAcc, FloatReg }
>  faddp, 0xdec0, None, CpuFP, NoSuf, { FloatReg }
>  // alias for faddp %st, %st(1)
>  faddp, 0xdec1, None, CpuFP, NoSuf, {}
> -faddp, 0xdec0, None, CpuFP, NoSuf|Ugh, { FloatReg, FloatAcc }
>
>  // subtract
>  fsub, 0xd8e0, None, CpuFP, NoSuf, { FloatReg }
> @@ -732,10 +731,10 @@ fmul, 0xdec9, None, CpuFP, NoSuf|Ugh|ATT
>  fmul, 0xd8, 1, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Dword|Qword|Unspecified|BaseIndex }
>  fimul, 0xde, 1, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Word|Dword|Unspecified|BaseIndex }
>
> -fmulp, 0xdec8, None, CpuFP, NoSuf, { FloatAcc, FloatReg }
> +fmulp, 0xdec8, None, CpuFP, D|NoSuf|Ugh, { FloatAcc, FloatReg }
>  fmulp, 0xdec8, None, CpuFP, NoSuf, { FloatReg }
> +// alias for fmulp %st, %st(1)
>  fmulp, 0xdec9, None, CpuFP, NoSuf, {}
> -fmulp, 0xdec8, None, CpuFP, NoSuf|Ugh, { FloatReg, FloatAcc }
>
>  // divide
>  fdiv, 0xd8f0, None, CpuFP, NoSuf, { FloatReg }
>
  
Jan Beulich Nov. 29, 2022, 9:02 a.m. UTC | #2
On 29.11.2022 00:21, H.J. Lu wrote:
> On Thu, Nov 24, 2022 at 12:58 AM Jan Beulich <jbeulich@suse.com> wrote:
>>
>> At the very least a comment in process_operands() is stale. Beyond that
>> there are effectively two options:
>> 1) It is possible that FADDP and FMULP were mistakenly not marked as
>>    being in need of dealing with the compiler anomaly, and hence the
>>    respective templates weren't removed at the time when they should
>>    have been.
>> 2) It is also possible that there are indeed uses known beyond compiler
>>    generated output for these two commutative opcodes, and hence the
>>    templates need to stay.
>> To be on the safe side assume 2: Update the comment and fold the
>> templates into their "normal" ones (utilizing D), adjusting consuming
>> code accordingly.
>>
>> For FMULP also add a comment paralleling a similar one FADDP has.
> 
> Please mention dropping GCC 2.8.1 support in gas/NEWS.

For the old release, many, many years ago, when that support was dropped?
I'm not dropping any support here, I'm merely cleaning up after that sort
of incomplete dropping. And the title also clearly says exactly that.

Jan
  
H.J. Lu Nov. 30, 2022, midnight UTC | #3
On Thu, Nov 24, 2022 at 12:58 AM Jan Beulich <jbeulich@suse.com> wrote:
>
> At the very least a comment in process_operands() is stale. Beyond that
> there are effectively two options:
> 1) It is possible that FADDP and FMULP were mistakenly not marked as
>    being in need of dealing with the compiler anomaly, and hence the
>    respective templates weren't removed at the time when they should
>    have been.
> 2) It is also possible that there are indeed uses known beyond compiler
>    generated output for these two commutative opcodes, and hence the
>    templates need to stay.
> To be on the safe side assume 2: Update the comment and fold the
> templates into their "normal" ones (utilizing D), adjusting consuming
> code accordingly.
>
> For FMULP also add a comment paralleling a similar one FADDP has.
>
> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -6806,7 +6806,8 @@ match_template (char mnem_suffix)
>                 found_reverse_match = 0;
>               else if (operand_types[0].bitfield.tbyte)
>                 {
> -                 found_reverse_match = Opcode_FloatD;
> +                 if (t->opcode_modifier.operandconstraint != UGH)
> +                   found_reverse_match = Opcode_FloatD;
>                   /* FSUB{,R} and FDIV{,R} may need a 2nd bit flipped.  */
>                   if ((t->base_opcode & 0x20)
>                       && (intel_syntax || intel_mnemonic))
> @@ -7997,29 +7998,31 @@ process_operands (void)
>      {
>        /* The register or float register operand is in operand
>          0 or 1.  */
> -      unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
> +      const reg_entry *r = i.op[0].regs;
>
> +      if (i.imm_operands
> +         || (r->reg_type.bitfield.instance == Accum && i.op[1].regs))
> +       r = i.op[1].regs;
>        /* Register goes in low 3 bits of opcode.  */
> -      i.tm.base_opcode |= i.op[op].regs->reg_num;
> -      if ((i.op[op].regs->reg_flags & RegRex) != 0)
> +      i.tm.base_opcode |= r->reg_num;
> +      if ((r->reg_flags & RegRex) != 0)
>         i.rex |= REX_B;
>        if (!quiet_warnings && i.tm.opcode_modifier.operandconstraint == UGH)
>         {
> -         /* Warn about some common errors, but press on regardless.
> -            The first case can be generated by gcc (<= 2.8.1).  */
> -         if (i.operands == 2)
> -           {
> -             /* Reversed arguments on faddp, fsubp, etc.  */
> -             as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
> -                      register_prefix, i.op[!intel_syntax].regs->reg_name,
> -                      register_prefix, i.op[intel_syntax].regs->reg_name);
> -           }
> -         else
> +         /* Warn about some common errors, but press on regardless.  */
> +         if (i.operands != 2)
>             {
>               /* Extraneous `l' suffix on fp insn.  */
>               as_warn (_("translating to `%s %s%s'"), i.tm.name,
>                        register_prefix, i.op[0].regs->reg_name);
>             }
> +         else if (i.op[0].regs->reg_type.bitfield.instance != Accum)
> +           {
> +             /* Reversed arguments on faddp or fmulp.  */
> +             as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
> +                      register_prefix, i.op[!intel_syntax].regs->reg_name,
> +                      register_prefix, i.op[intel_syntax].regs->reg_name);
> +           }
>         }
>      }
>
> --- a/opcodes/i386-opc.tbl
> +++ b/opcodes/i386-opc.tbl
> @@ -686,11 +686,10 @@ fadd, 0xdec1, None, CpuFP, NoSuf|Ugh|ATT
>  fadd, 0xd8, 0, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Dword|Qword|Unspecified|BaseIndex }
>  fiadd, 0xde, 0, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Word|Dword|Unspecified|BaseIndex }
>
> -faddp, 0xdec0, None, CpuFP, NoSuf, { FloatAcc, FloatReg }
> +faddp, 0xdec0, None, CpuFP, D|NoSuf|Ugh, { FloatAcc, FloatReg }
>  faddp, 0xdec0, None, CpuFP, NoSuf, { FloatReg }
>  // alias for faddp %st, %st(1)
>  faddp, 0xdec1, None, CpuFP, NoSuf, {}
> -faddp, 0xdec0, None, CpuFP, NoSuf|Ugh, { FloatReg, FloatAcc }
>
>  // subtract
>  fsub, 0xd8e0, None, CpuFP, NoSuf, { FloatReg }
> @@ -732,10 +731,10 @@ fmul, 0xdec9, None, CpuFP, NoSuf|Ugh|ATT
>  fmul, 0xd8, 1, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Dword|Qword|Unspecified|BaseIndex }
>  fimul, 0xde, 1, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Word|Dword|Unspecified|BaseIndex }
>
> -fmulp, 0xdec8, None, CpuFP, NoSuf, { FloatAcc, FloatReg }
> +fmulp, 0xdec8, None, CpuFP, D|NoSuf|Ugh, { FloatAcc, FloatReg }
>  fmulp, 0xdec8, None, CpuFP, NoSuf, { FloatReg }
> +// alias for fmulp %st, %st(1)
>  fmulp, 0xdec9, None, CpuFP, NoSuf, {}
> -fmulp, 0xdec8, None, CpuFP, NoSuf|Ugh, { FloatReg, FloatAcc }
>
>  // divide
>  fdiv, 0xd8f0, None, CpuFP, NoSuf, { FloatReg }
>

OK.

Thanks.
  

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -6806,7 +6806,8 @@  match_template (char mnem_suffix)
 		found_reverse_match = 0;
 	      else if (operand_types[0].bitfield.tbyte)
 		{
-		  found_reverse_match = Opcode_FloatD;
+		  if (t->opcode_modifier.operandconstraint != UGH)
+		    found_reverse_match = Opcode_FloatD;
 		  /* FSUB{,R} and FDIV{,R} may need a 2nd bit flipped.  */
 		  if ((t->base_opcode & 0x20)
 		      && (intel_syntax || intel_mnemonic))
@@ -7997,29 +7998,31 @@  process_operands (void)
     {
       /* The register or float register operand is in operand
 	 0 or 1.  */
-      unsigned int op = i.tm.operand_types[0].bitfield.class != Reg;
+      const reg_entry *r = i.op[0].regs;
 
+      if (i.imm_operands
+	  || (r->reg_type.bitfield.instance == Accum && i.op[1].regs))
+	r = i.op[1].regs;
       /* Register goes in low 3 bits of opcode.  */
-      i.tm.base_opcode |= i.op[op].regs->reg_num;
-      if ((i.op[op].regs->reg_flags & RegRex) != 0)
+      i.tm.base_opcode |= r->reg_num;
+      if ((r->reg_flags & RegRex) != 0)
 	i.rex |= REX_B;
       if (!quiet_warnings && i.tm.opcode_modifier.operandconstraint == UGH)
 	{
-	  /* Warn about some common errors, but press on regardless.
-	     The first case can be generated by gcc (<= 2.8.1).  */
-	  if (i.operands == 2)
-	    {
-	      /* Reversed arguments on faddp, fsubp, etc.  */
-	      as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
-		       register_prefix, i.op[!intel_syntax].regs->reg_name,
-		       register_prefix, i.op[intel_syntax].regs->reg_name);
-	    }
-	  else
+	  /* Warn about some common errors, but press on regardless.  */
+	  if (i.operands != 2)
 	    {
 	      /* Extraneous `l' suffix on fp insn.  */
 	      as_warn (_("translating to `%s %s%s'"), i.tm.name,
 		       register_prefix, i.op[0].regs->reg_name);
 	    }
+	  else if (i.op[0].regs->reg_type.bitfield.instance != Accum)
+	    {
+	      /* Reversed arguments on faddp or fmulp.  */
+	      as_warn (_("translating to `%s %s%s,%s%s'"), i.tm.name,
+		       register_prefix, i.op[!intel_syntax].regs->reg_name,
+		       register_prefix, i.op[intel_syntax].regs->reg_name);
+	    }
 	}
     }
 
--- a/opcodes/i386-opc.tbl
+++ b/opcodes/i386-opc.tbl
@@ -686,11 +686,10 @@  fadd, 0xdec1, None, CpuFP, NoSuf|Ugh|ATT
 fadd, 0xd8, 0, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Dword|Qword|Unspecified|BaseIndex }
 fiadd, 0xde, 0, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Word|Dword|Unspecified|BaseIndex }
 
-faddp, 0xdec0, None, CpuFP, NoSuf, { FloatAcc, FloatReg }
+faddp, 0xdec0, None, CpuFP, D|NoSuf|Ugh, { FloatAcc, FloatReg }
 faddp, 0xdec0, None, CpuFP, NoSuf, { FloatReg }
 // alias for faddp %st, %st(1)
 faddp, 0xdec1, None, CpuFP, NoSuf, {}
-faddp, 0xdec0, None, CpuFP, NoSuf|Ugh, { FloatReg, FloatAcc }
 
 // subtract
 fsub, 0xd8e0, None, CpuFP, NoSuf, { FloatReg }
@@ -732,10 +731,10 @@  fmul, 0xdec9, None, CpuFP, NoSuf|Ugh|ATT
 fmul, 0xd8, 1, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Dword|Qword|Unspecified|BaseIndex }
 fimul, 0xde, 1, CpuFP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf|No_ldSuf, { Word|Dword|Unspecified|BaseIndex }
 
-fmulp, 0xdec8, None, CpuFP, NoSuf, { FloatAcc, FloatReg }
+fmulp, 0xdec8, None, CpuFP, D|NoSuf|Ugh, { FloatAcc, FloatReg }
 fmulp, 0xdec8, None, CpuFP, NoSuf, { FloatReg }
+// alias for fmulp %st, %st(1)
 fmulp, 0xdec9, None, CpuFP, NoSuf, {}
-fmulp, 0xdec8, None, CpuFP, NoSuf|Ugh, { FloatReg, FloatAcc }
 
 // divide
 fdiv, 0xd8f0, None, CpuFP, NoSuf, { FloatReg }