Hi Mark,

> Le 23 oct. 2023 à 16:07, Hatle, Mark <mark.ha...@amd.com> a écrit :
> 
> Not sure if this will work, but there is a strverscmp function in libiberty 
> that I think will work.
> 
> So the microblaze version compare could be done as:
> 
> #define MICROBLAZE_VERSION_COMPARE(VA,VB) strvercmp(VA, VB)
> 
> (I've not tried this, just remembered doing something similar in the past.)
> 
> --Mark

Thank you for the good idea.  I will have a look.  The current version of the 
patch I submitted basically came from the meta-xilinx gcc patch 0024.  If there 
is already a way to version compare, we probably never should have implemented 
our own routine to being with.

I will check this out, and submit a v2 for this patch, if it works.

Best regards,
Neal Frager
AMD


> 
>> On 10/23/23 12:48 AM, Neal Frager wrote:
>> There is a microblaze cpu version 10.0 included in versal. If the
>> minor version is only a single digit, then the version comparison
>> will fail as version 10.0 will appear as 100 compared to version
>> 6.00 or 8.30 which will calculate to values 600 and 830.
>> The issue can be seen when using the '-mcpu=10.0' option.
>> With this fix, versions with a single digit minor number such as
>> 10.0 will be calculated as greater than versions with a smaller
>> major version number, but with two minor version digits.
>> By applying this fix, several incorrect warning messages will no
>> longer be printed when building the versal plm application, such
>> as the warning message below:
>> warning: '-mxl-multiply-high' can be used only with '-mcpu=v6.00.a' or 
>> greater
>> Signed-off-by: Neal Frager <neal.fra...@amd.com>
>> ---
>>  gcc/config/microblaze/microblaze.cc | 164 +++++++++++++---------------
>>  1 file changed, 76 insertions(+), 88 deletions(-)
>> diff --git a/gcc/config/microblaze/microblaze.cc 
>> b/gcc/config/microblaze/microblaze.cc
>> index c9f6c4198cf..6e1555f6eb3 100644
>> --- a/gcc/config/microblaze/microblaze.cc
>> +++ b/gcc/config/microblaze/microblaze.cc
>> @@ -56,8 +56,6 @@
>>  /* This file should be included last.  */
>>  #include "target-def.h"
>>  -#define MICROBLAZE_VERSION_COMPARE(VA,VB) strcasecmp (VA, VB)
>> -
>>  /* Classifies an address.
>>    ADDRESS_INVALID
>> @@ -1297,12 +1295,73 @@ microblaze_expand_block_move (rtx dest, rtx src, rtx 
>> length, rtx align_rtx)
>>    return false;
>>  }
>>  +/*  Convert a version number of the form "vX.YY.Z" to an integer encoding
>> +    for easier range comparison.  */
>> +static int
>> +microblaze_version_to_int (const char *version)
>> +{
>> +  const char *p, *v;
>> +  const char *tmpl = "vXX.YY.Z";
>> +  int iver1 =0, iver2 =0, iver3 =0;
>> +
>> +  p = version;
>> +  v = tmpl;
>> +
>> +  while (*p)
>> +    {
>> +      if (*v == 'X')
>> +    {            /* Looking for major  */
>> +      if (*p == '.')
>> +        *v++;
>> +      else
>> +        {
>> +          if (!(*p >= '0' && *p <= '9'))
>> +        return -1;
>> +          iver1 += (int) (*p - '0');
>> +          iver1 *= 1000;
>> +        }
>> +    }
>> +      else if (*v == 'Y')
>> +    {            /* Looking for minor  */
>> +      if (!(*p >= '0' && *p <= '9'))
>> +        return -1;
>> +      iver2 += (int) (*p - '0');
>> +      iver2 *= 10;
>> +    }
>> +      else if (*v == 'Z')
>> +    {            /* Looking for compat  */
>> +      if (!(*p >= 'a' && *p <= 'z'))
>> +        return -1;
>> +      iver3 = (int) (*p - 'a');
>> +    }
>> +      else
>> +    {
>> +      if (*p != *v)
>> +        return -1;
>> +    }
>> +
>> +      v++;
>> +      p++;
>> +    }
>> +
>> +  if (*p)
>> +    return -1;
>> +
>> +  return iver1 + iver2 + iver3;
>> +}
>> +
>>  static bool
>>  microblaze_rtx_costs (rtx x, machine_mode mode, int outer_code 
>> ATTRIBUTE_UNUSED,
>>                int opno ATTRIBUTE_UNUSED, int *total,
>>                bool speed ATTRIBUTE_UNUSED)
>>  {
>>    int code = GET_CODE (x);
>> +  int ver, ver_int;
>> +
>> +  if (microblaze_select_cpu == NULL)
>> +    microblaze_select_cpu = MICROBLAZE_DEFAULT_CPU;
>> +
>> +  ver_int = microblaze_version_to_int (microblaze_select_cpu);
>>      switch (code)
>>      {
>> @@ -1345,8 +1404,8 @@ microblaze_rtx_costs (rtx x, machine_mode mode, int 
>> outer_code ATTRIBUTE_UNUSED,
>>        {
>>      if (TARGET_BARREL_SHIFT)
>>        {
>> -        if (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v5.00.a")
>> -        >= 0)
>> +        ver = ver_int - microblaze_version_to_int("v5.00.a");
>> +        if (ver >= 0)
>>            *total = COSTS_N_INSNS (1);
>>          else
>>            *total = COSTS_N_INSNS (2);
>> @@ -1407,8 +1466,8 @@ microblaze_rtx_costs (rtx x, machine_mode mode, int 
>> outer_code ATTRIBUTE_UNUSED,
>>        }
>>      else if (!TARGET_SOFT_MUL)
>>        {
>> -        if (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v5.00.a")
>> -        >= 0)
>> +        ver = ver_int - microblaze_version_to_int("v5.00.a");
>> +        if (ver >= 0)
>>            *total = COSTS_N_INSNS (1);
>>          else
>>            *total = COSTS_N_INSNS (3);
>> @@ -1681,72 +1740,13 @@ function_arg_partial_bytes (cumulative_args_t cum_v,
>>    return 0;
>>  }
>>  -/*  Convert a version number of the form "vX.YY.Z" to an integer encoding
>> -    for easier range comparison.  */
>> -static int
>> -microblaze_version_to_int (const char *version)
>> -{
>> -  const char *p, *v;
>> -  const char *tmpl = "vXX.YY.Z";
>> -  int iver = 0;
>> -
>> -  p = version;
>> -  v = tmpl;
>> -
>> -  while (*p)
>> -    {
>> -      if (*v == 'X')
>> -    {            /* Looking for major  */
>> -          if (*p == '.')
>> -            {
>> -              v++;
>> -            }
>> -          else
>> -            {
>> -          if (!(*p >= '0' && *p <= '9'))
>> -            return -1;
>> -          iver += (int) (*p - '0');
>> -              iver *= 10;
>> -         }
>> -        }
>> -      else if (*v == 'Y')
>> -    {            /* Looking for minor  */
>> -      if (!(*p >= '0' && *p <= '9'))
>> -        return -1;
>> -      iver += (int) (*p - '0');
>> -      iver *= 10;
>> -    }
>> -      else if (*v == 'Z')
>> -    {            /* Looking for compat  */
>> -      if (!(*p >= 'a' && *p <= 'z'))
>> -        return -1;
>> -      iver *= 10;
>> -      iver += (int) (*p - 'a');
>> -    }
>> -      else
>> -    {
>> -      if (*p != *v)
>> -        return -1;
>> -    }
>> -
>> -      v++;
>> -      p++;
>> -    }
>> -
>> -  if (*p)
>> -    return -1;
>> -
>> -  return iver;
>> -}
>> -
>> -
>>  static void
>>  microblaze_option_override (void)
>>  {
>>    int i, start;
>>    int regno;
>>    machine_mode mode;
>> -  int ver;
>> +  int ver, ver_int;
>>      microblaze_section_threshold = (OPTION_SET_P (g_switch_value)
>>                    ? g_switch_value
>> @@ -1767,29 +1767,22 @@ microblaze_option_override (void)
>>    /* Check the MicroBlaze CPU version for any special action to be done.  */
>>    if (microblaze_select_cpu == NULL)
>>      microblaze_select_cpu = MICROBLAZE_DEFAULT_CPU;
>> -  ver = microblaze_version_to_int (microblaze_select_cpu);
>> -  if (ver == -1)
>> +  ver_int = microblaze_version_to_int (microblaze_select_cpu);
>> +  if (ver_int == -1)
>>      {
>>        error ("%qs is an invalid argument to %<-mcpu=%>", 
>> microblaze_select_cpu);
>>      }
>>  -  ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v3.00.a");
>> +  ver = ver_int - microblaze_version_to_int("v3.00.a");
>>    if (ver < 0)
>>      {
>>        /* No hardware exceptions in earlier versions. So no worries.  */
>> -#if 0
>> -      microblaze_select_flags &= ~(MICROBLAZE_MASK_NO_UNSAFE_DELAY);
>> -#endif
>>        microblaze_no_unsafe_delay = 0;
>>        microblaze_pipe = MICROBLAZE_PIPE_3;
>>      }
>>    else if (ver == 0
>> -       || (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v4.00.b")
>> -           == 0))
>> +       || (ver_int ==  microblaze_version_to_int("v4.00.b")))
>>      {
>> -#if 0
>> -      microblaze_select_flags |= (MICROBLAZE_MASK_NO_UNSAFE_DELAY);
>> -#endif
>>        microblaze_no_unsafe_delay = 1;
>>        microblaze_pipe = MICROBLAZE_PIPE_3;
>>      }
>> @@ -1797,16 +1790,11 @@ microblaze_option_override (void)
>>      {
>>        /* We agree to use 5 pipe-stage model even on area optimized 3
>>           pipe-stage variants.  */
>> -#if 0
>> -      microblaze_select_flags &= ~(MICROBLAZE_MASK_NO_UNSAFE_DELAY);
>> -#endif
>>        microblaze_no_unsafe_delay = 0;
>>        microblaze_pipe = MICROBLAZE_PIPE_5;
>> -      if (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v5.00.a") == 0
>> -      || MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu,
>> -                     "v5.00.b") == 0
>> -      || MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu,
>> -                     "v5.00.c") == 0)
>> +      if ((ver_int == microblaze_version_to_int("v5.00.a"))
>> +      || (ver_int == microblaze_version_to_int("v5.00.b"))
>> +      || (ver_int == microblaze_version_to_int("v5.00.c")))
>>      {
>>        /* Pattern compares are to be turned on by default only when
>>            compiling for MB v5.00.'z'.  */
>> @@ -1814,7 +1802,7 @@ microblaze_option_override (void)
>>      }
>>      }
>>  -  ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v6.00.a");
>> +  ver = ver_int - microblaze_version_to_int("v6.00.a");
>>    if (ver < 0)
>>      {
>>        if (TARGET_MULTIPLY_HIGH)
>> @@ -1823,7 +1811,7 @@ microblaze_option_override (void)
>>           "%<-mcpu=v6.00.a%> or greater");
>>      }
>>  -  ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v8.10.a");
>> +  ver = ver_int - microblaze_version_to_int("v8.10.a");
>>    microblaze_has_clz = 1;
>>    if (ver < 0)
>>      {
>> @@ -1832,7 +1820,7 @@ microblaze_option_override (void)
>>      }
>>      /* TARGET_REORDER defaults to 2 if -mxl-reorder not specified.  */
>> -  ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v8.30.a");
>> +  ver = ver_int - microblaze_version_to_int("v8.30.a");
>>    if (ver < 0)
>>      {
>>          if (TARGET_REORDER == 1)

Reply via email to