aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch
diff options
context:
space:
mode:
Diffstat (limited to 'toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch')
-rw-r--r--toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch119
1 files changed, 119 insertions, 0 deletions
diff --git a/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch b/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch
new file mode 100644
index 0000000000..64eb23777d
--- /dev/null
+++ b/toolchain-layer/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99523.patch
@@ -0,0 +1,119 @@
+2011-07-14 Richard Sandiford <richard.sandiford@linaro.org>
+
+ Backport from mainline:
+ gcc/
+ 2011-07-07 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * reload1.c (choose_reload_regs): Use mode sizes to check whether
+ an old reload register completely defines the required value.
+
+ gcc/testsuite/
+ 2011-07-07 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * gcc.target/arm/neon-modes-3.c: New test.
+
+=== modified file 'gcc/reload1.c'
+--- old/gcc/reload1.c 2011-07-01 09:27:50 +0000
++++ new/gcc/reload1.c 2011-07-11 10:05:08 +0000
+@@ -6449,6 +6449,8 @@
+
+ if (regno >= 0
+ && reg_last_reload_reg[regno] != 0
++ && (GET_MODE_SIZE (GET_MODE (reg_last_reload_reg[regno]))
++ >= GET_MODE_SIZE (mode) + byte)
+ #ifdef CANNOT_CHANGE_MODE_CLASS
+ /* Verify that the register it's in can be used in
+ mode MODE. */
+@@ -6460,24 +6462,12 @@
+ {
+ enum reg_class rclass = rld[r].rclass, last_class;
+ rtx last_reg = reg_last_reload_reg[regno];
+- enum machine_mode need_mode;
+
+ i = REGNO (last_reg);
+ i += subreg_regno_offset (i, GET_MODE (last_reg), byte, mode);
+ last_class = REGNO_REG_CLASS (i);
+
+- if (byte == 0)
+- need_mode = mode;
+- else
+- need_mode
+- = smallest_mode_for_size
+- (GET_MODE_BITSIZE (mode) + byte * BITS_PER_UNIT,
+- GET_MODE_CLASS (mode) == MODE_PARTIAL_INT
+- ? MODE_INT : GET_MODE_CLASS (mode));
+-
+- if ((GET_MODE_SIZE (GET_MODE (last_reg))
+- >= GET_MODE_SIZE (need_mode))
+- && reg_reloaded_contents[i] == regno
++ if (reg_reloaded_contents[i] == regno
+ && TEST_HARD_REG_BIT (reg_reloaded_valid, i)
+ && HARD_REGNO_MODE_OK (i, rld[r].mode)
+ && (TEST_HARD_REG_BIT (reg_class_contents[(int) rclass], i)
+
+=== added file 'gcc/testsuite/gcc.target/arm/neon-modes-3.c'
+--- old/gcc/testsuite/gcc.target/arm/neon-modes-3.c 1970-01-01 00:00:00 +0000
++++ new/gcc/testsuite/gcc.target/arm/neon-modes-3.c 2011-07-11 10:05:08 +0000
+@@ -0,0 +1,61 @@
++/* { dg-do compile } */
++/* { dg-require-effective-target arm_neon_ok } */
++/* { dg-options "-O" } */
++/* { dg-add-options arm_neon } */
++
++#include <arm_neon.h>
++
++void f1 (volatile float32x4_t *dest, volatile float32x4x4_t *src, int n)
++{
++ float32x4x4_t a5, a6, a7, a8, a9;
++ int i;
++
++ a5 = *src;
++ a6 = *src;
++ a7 = *src;
++ a8 = *src;
++ a9 = *src;
++ while (n--)
++ {
++ for (i = 0; i < 8; i++)
++ {
++ float32x4x4_t a0, a1, a2, a3, a4;
++
++ a0 = *src;
++ a1 = *src;
++ a2 = *src;
++ a3 = *src;
++ a4 = *src;
++ *src = a0;
++ *dest = a0.val[0];
++ *dest = a0.val[3];
++ *src = a1;
++ *dest = a1.val[0];
++ *dest = a1.val[3];
++ *src = a2;
++ *dest = a2.val[0];
++ *dest = a2.val[3];
++ *src = a3;
++ *dest = a3.val[0];
++ *dest = a3.val[3];
++ *src = a4;
++ *dest = a4.val[0];
++ *dest = a4.val[3];
++ }
++ *src = a5;
++ *dest = a5.val[0];
++ *dest = a5.val[3];
++ *src = a6;
++ *dest = a6.val[0];
++ *dest = a6.val[3];
++ *src = a7;
++ *dest = a7.val[0];
++ *dest = a7.val[3];
++ *src = a8;
++ *dest = a8.val[0];
++ *dest = a8.val[3];
++ *src = a9;
++ *dest = a9.val[0];
++ *dest = a9.val[3];
++ }
++}
+