diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2012-04-19 11:29:13 +0000 |
---|---|---|
committer | Georg-Johann Lay <gjl@gcc.gnu.org> | 2012-04-19 11:29:13 +0000 |
commit | 20955f5acf05cd84927826a268caa847abfe3a6d (patch) | |
tree | 2b67ca493661403c2e5df29d99183af34b15b21b /gcc | |
parent | e4eb230d8daeb364ed125d7275736b6befa9896a (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 15 |
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) |