blob: dce1bc58b73cbed1c5b6f223895057c3c063b708 [file] [log] [blame]
From 3db8f0c3124d3001d3c10e6d400943f3ec57616b Mon Sep 17 00:00:00 2001
From: Mahesh Bodapati <mbodapat@xilinx.com>
Date: Wed, 18 Jan 2017 12:42:10 +0530
Subject: [PATCH 32/54] [Patch, microblaze]: 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 <mbodapat@xilinx.com>
Nagaraju Mekala <nmekala@xilix.com>
---
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 70d8d03..30a0fcf 100644
--- a/gcc/config/microblaze/microblaze.c
+++ b/gcc/config/microblaze/microblaze.c
@@ -238,6 +238,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)
@@ -1266,8 +1323,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);
@@ -1328,8 +1384,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);
@@ -1609,72 +1664,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
@@ -1695,13 +1691,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. */
@@ -1712,8 +1708,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);
@@ -1730,11 +1725,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'. */
@@ -1742,7 +1735,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)
@@ -1750,7 +1743,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)
{
@@ -1759,7 +1752,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.7.4