aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2012-04-19 11:29:13 +0000
committerGeorg-Johann Lay <gjl@gcc.gnu.org>2012-04-19 11:29:13 +0000
commit20955f5acf05cd84927826a268caa847abfe3a6d (patch)
tree2b67ca493661403c2e5df29d99183af34b15b21b /gcc
parente4eb230d8daeb364ed125d7275736b6befa9896a (diff)
downloadgcc-20955f5acf05cd84927826a268caa847abfe3a6d.zip
gcc-20955f5acf05cd84927826a268caa847abfe3a6d.tar.gz
gcc-20955f5acf05cd84927826a268caa847abfe3a6d.tar.bz2
re PR target/53033 ([avr]: Wrong register number for 3-byte loads via X)
PR target/53033 * config/avr/avr.c (avr_out_load_psi): Fix assembler template for the case *(X+const). From-SVN: r186588
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/avr/avr.c15
2 files changed, 14 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 61dd836..086b813 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-04-19 Georg-Johann Lay <avr@gjlay.de>
+
+ PR target/53033
+ * config/avr/avr.c (avr_out_load_psi): Fix assembler template for
+ the case *(X+const).
+
2012-04-19 Ramana Radhakrishnan <ramana.radhakrishnan@linaro.org>
* config/arm/sync.md (sync_optab): Change ior attribute to "or".
diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c
index c25f898..af00aee 100644
--- a/gcc/config/avr/avr.c
+++ b/gcc/config/avr/avr.c
@@ -3476,15 +3476,16 @@ avr_out_load_psi (rtx insn, rtx *op, int *plen)
"mov r27,__tmp_reg__", op, plen, -6);
}
- avr_asm_len ("adiw r26,%o1" CR_TAB
- "ld r24,X+" CR_TAB
- "ld r25,X+" CR_TAB
- "ld r26,X", op, plen, -4);
+ avr_asm_len ("adiw r26,%o1" CR_TAB
+ "ld %A0,X+" CR_TAB
+ "ld %B0,X+" CR_TAB
+ "ld %C0,X", op, plen, -4);
- if (reg_dest != REG_X - 2)
- avr_asm_len ("sbiw r26,%o1+2", op, plen, 1);
+ if (reg_dest != REG_W
+ && !reg_unused_after (insn, XEXP (base, 0)))
+ avr_asm_len ("sbiw r26,%o1+2", op, plen, 1);
- return "";
+ return "";
}
if (reg_dest == reg_base)