PR 33214 sparc LDM/STM/LDMA/STMA etc. FAIL on Solaris/SPARC

Jose E. Marchesi jose.marchesi@oracle.com
Mon Jul 28 18:38:33 GMT 2025


Hi Alan.

FWIW the change LGTM.

> Delete code in compare_opcodes preferencing 1+i over i+1 and 1,i over
> i,1.  Instead simply make the sort stable, by keeping the original
> table order.
>
> diff --git a/opcodes/sparc-dis.c b/opcodes/sparc-dis.c
> index 1138136846c..f9357834ff9 100644
> --- a/opcodes/sparc-dis.c
> +++ b/opcodes/sparc-dis.c
> @@ -387,40 +387,12 @@ compare_opcodes (const void * a, const void * b)
>        return length_diff;
>    }
>  
> -  /* Put 1+i before i+1.  */
> -  {
> -    char *p0 = (char *) strchr (op0->args, '+');
> -    char *p1 = (char *) strchr (op1->args, '+');
> -
> -    if (p0 && p1)
> -      {
> -	/* There is a plus in both operands.  Note that a plus
> -	   sign cannot be the first character in args,
> -	   so the following [-1]'s are valid.  */
> -	if (p0[-1] == 'i' && p1[1] == 'i')
> -	  /* op0 is i+1 and op1 is 1+i, so op1 goes first.  */
> -	  return 1;
> -	if (p0[1] == 'i' && p1[-1] == 'i')
> -	  /* op0 is 1+i and op1 is i+1, so op0 goes first.  */
> -	  return -1;
> -      }
> -  }
> -
> -  /* Put 1,i before i,1.  */
> -  {
> -    int i0 = strncmp (op0->args, "i,1", 3) == 0;
> -    int i1 = strncmp (op1->args, "i,1", 3) == 0;
> -
> -    if (i0 ^ i1)
> -      return i0 - i1;
> -  }
> -
> -  /* They are, as far as we can tell, identical.
> -     Since qsort may have rearranged the table partially, there is
> -     no way to tell which one was first in the opcode table as
> -     written, so just say there are equal.  */
> -  /* ??? This is no longer true now that we sort a vector of pointers,
> -     not the table itself.  */
> +  /* They are, as far as we can tell, identical.  Keep the order in
> +     the sparc_opcodes table.  */
> +  if (op0 < op1)
> +    return -1;
> +  if (op0 > op1)
> +    return 1;
>    return 0;
>  }


More information about the Binutils mailing list