blob: bd194f15415d618ff9eca165879b37616f65d072 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
From: Michael Olbrich <m.olbrich@pengutronix.de>
This is http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39429.
I've removed Michael's original patch and replaced it by the one from
the gcc bugzilla.
Signed-off-by: Robert Schwebel <r.schwebel@pengutronix.de>
---
gcc/config/arm/arm.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
Index: gcc-4.5.1/gcc/config/arm/arm.md
===================================================================
--- gcc-4.5.1.orig/gcc/config/arm/arm.md
+++ gcc-4.5.1/gcc/config/arm/arm.md
@@ -10390,6 +10390,21 @@
else
{
/* Offset is out of range for a single add, so use two ldr. */
+
+ /* Swap the ldrs if the first ldr would clobber the shared base_reg. */
+ if (REGNO (ldm[1]) == REGNO (base_reg))
+ {
+ rtx tmp_reg;
+ HOST_WIDE_INT tmp_val;
+
+ tmp_reg = ldm[1];
+ ldm[1] = ldm[2];
+ ldm[2] = tmp_reg;
+ tmp_val = val1;
+ val1 = val2;
+ val2 = tmp_val;
+ }
+
ops[0] = ldm[1];
ops[1] = base_reg;
ops[2] = GEN_INT (val1);
|