fix more risc-v compiler bugs
[akaros.git] / tools / compilers / gcc-glibc / gcc-4.6.1-riscv.patch
index 03621e3..2026981 100644 (file)
@@ -2247,10 +2247,10 @@ index 0000000..9b2aa4c
 +#endif /* ! GCC_MIPS_PROTOS_H */
 diff --git a/gcc-4.6.1/gcc/config/riscv/riscv.c b/gcc-4.6.1/gcc/config/riscv/riscv.c
 new file mode 100644
-index 0000000..c325df9
+index 0000000..5ef5a5d
 --- /dev/null
 +++ gcc-4.6.1/gcc/config/riscv/riscv.c
-@@ -0,0 +1,6479 @@
+@@ -0,0 +1,6434 @@
 +/* Subroutines used for MIPS code generation.
 +   Copyright (C) 1989, 1990, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
 +   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
@@ -2796,8 +2796,8 @@ index 0000000..c325df9
 +   Return the number of operations needed.  */
 +
 +static unsigned int
-+mips_build_integer_1 (struct mips_integer_op *codes,
-+                    unsigned HOST_WIDE_INT value)
++mips_build_integer (struct mips_integer_op *codes,
++                  unsigned HOST_WIDE_INT value)
 +{
 +  unsigned HOST_WIDE_INT high_part = RISCV_CONST_HIGH_PART (value);
 +  unsigned HOST_WIDE_INT low_part = RISCV_CONST_LOW_PART (value);
@@ -2825,7 +2825,7 @@ index 0000000..c325df9
 +    {
 +      /* Try eliminating all trailing zeros by ending with SLL. */
 +      unsigned lshift = __builtin_ctzl (value);
-+      cost = mips_build_integer_1 (codes, (int64_t)value >> lshift);
++      cost = mips_build_integer (codes, (int64_t)value >> lshift);
 +      codes[cost].code = ASHIFT;
 +      codes[cost].value = lshift;
 +      cost++;
@@ -2834,7 +2834,7 @@ index 0000000..c325df9
 +  if (low_part != 0)
 +    {
 +      struct mips_integer_op add_codes[MIPS_MAX_INTEGER_OPS];
-+      unsigned add_cost = mips_build_integer_1 (add_codes, high_part);
++      unsigned add_cost = mips_build_integer (add_codes, high_part);
 +      add_codes[add_cost].code = PLUS;
 +      add_codes[add_cost].value = low_part;
 +      add_cost++;
@@ -2851,51 +2851,6 @@ index 0000000..c325df9
 +  return cost;
 +}
 +
-+static unsigned int
-+mips_build_integer (struct mips_integer_op *codes,
-+                  unsigned HOST_WIDE_INT value)
-+{
-+  unsigned cost = mips_build_integer_1 (codes, value);
-+
-+  if (cost > 2 && (int64_t)value >= 0)
-+    {
-+      /* Try eliminating all leading zeros by ending with SRL. */
-+      struct mips_integer_op rshift_codes[MIPS_MAX_INTEGER_OPS];
-+      unsigned rshift_cost, rshift;
-+      unsigned HOST_WIDE_INT rshift_value;
-+
-+      rshift = __builtin_clzl (value);
-+      rshift_value = value << rshift;
-+      rshift_cost = mips_build_integer_1 (rshift_codes, rshift_value);
-+
-+      rshift_codes[rshift_cost].code = LSHIFTRT;
-+      rshift_codes[rshift_cost].value = rshift;
-+      rshift_cost++;
-+
-+      if (rshift_cost < cost)
-+      {
-+        memcpy (codes, rshift_codes, rshift_cost * sizeof (codes[0]));
-+          cost = rshift_cost;
-+      }
-+
-+      /* Try again with the discarded bits as 1s. */
-+      rshift_value = (value << rshift) | (((HOST_WIDE_INT)1 << rshift)-1);
-+      rshift_cost = mips_build_integer_1 (rshift_codes, rshift_value);
-+
-+      rshift_codes[rshift_cost].code = LSHIFTRT;
-+      rshift_codes[rshift_cost].value = rshift;
-+      rshift_cost++;
-+
-+      if (rshift_cost < cost)
-+      {
-+        memcpy (codes, rshift_codes, rshift_cost * sizeof (codes[0]));
-+          cost = rshift_cost;
-+      }
-+    }
-+
-+  return cost;
-+}
-+
 +/* Return true if X is a thread-local symbol.  */
 +
 +static bool