From 3eada9d81437d378ef24f11a8bd046fee5b3505a Mon Sep 17 00:00:00 2001 From: Mahesh Bodapati Date: Sat, 26 Aug 2017 19:21:49 -0700 Subject: [PATCH] Fix bug in MB version calculation This patch fixes the bug in microblaze_version_to_int function. Earlier the conversion of vXX.YY.Z to int has a bug which is fixed now. Signed-off-by: Mahesh Bodapati Signed-off-by: Nagaraju Mekala Signed-off-by: Manjukumar Matha Upstream-Status: Pending --- gcc/config/microblaze/microblaze.c | 147 ++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 77 deletions(-) diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c index 2ed64971fb..55dba83882 100644 --- a/gcc/config/microblaze/microblaze.c +++ b/gcc/config/microblaze/microblaze.c @@ -239,6 +239,63 @@ section *sdata2_section; #define TARGET_HAVE_TLS true #endif +/* 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)) - 96; + } + else + { + if (*p != *v) + return -1; + } + + v++; + p++; + } + + if (*p) + return -1; + + return iver1 + iver2 + iver3; +} + /* Return truth value if a CONST_DOUBLE is ok to be a legitimate constant. */ static bool microblaze_const_double_ok (rtx op, machine_mode mode) @@ -1267,8 +1324,7 @@ 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) + if (microblaze_version_to_int(microblaze_select_cpu) >= microblaze_version_to_int("v5.00.a")) *total = COSTS_N_INSNS (1); else *total = COSTS_N_INSNS (2); @@ -1329,8 +1385,7 @@ 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) + if (microblaze_version_to_int(microblaze_select_cpu) >= microblaze_version_to_int("v5.00.a")) *total = COSTS_N_INSNS (1); else *total = COSTS_N_INSNS (3); @@ -1610,72 +1665,13 @@ function_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode, 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) { register int i, start; register int regno; register machine_mode mode; - int ver; + int ver,ver_int; microblaze_section_threshold = (global_options_set.x_g_switch_value ? g_switch_value @@ -1696,13 +1692,13 @@ 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. */ @@ -1713,8 +1709,7 @@ microblaze_option_override (void) 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); @@ -1731,11 +1726,9 @@ microblaze_option_override (void) #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'. */ @@ -1743,7 +1736,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) @@ -1751,7 +1744,7 @@ microblaze_option_override (void) "-mxl-multiply-high can be used only with -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) { @@ -1760,7 +1753,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) -- 2.14.2