2012/3/19 Georg-Johann Lay <a...@gjlay.de>:
> http://gcc.gnu.org/ml/gcc-patches/2012-03/msg00641.html
>
> Georg-Johann Lay wrote:
>> The problem with the PR is that lower-subreg.c happily splits multi-byte 
>> moves
>> from address spaces without knowing anything about the additional costs this 
>> is
>> causing.
>>
>> The TARGET_MODE_DEPENDENT_ADDRESS_P hook cannot be used for 16-bit addresses
>> because that hook is not sensitive to address spaces, but is is used for the
>> 24-bit address space to avoid subreg lowering for PSImode.
>>
>> For the 16-bit address spaces the mov expander now assigns the address 
>> register
>> by hand as post-increment.
>>
>> Luckily, post-increment is the only addressing mode that makes sense with the
>> non-generic address spaces and there is no choice for the address register
>> resp. addressing mode, anyway...
>>
>> This patch does not fix the PR issue, of course, it just avoids subreg 
>> lowering
>> by using/pretending mode-dependent addresses.
>>
>> Ok for trunk?
>>
>> Johann
>>
>>       PR rtl-optimization/52543
>>       * config/avr/avr.c (avr_mode_dependent_address_p): New function.
>>       (TARGET_MODE_DEPENDENT_ADDRESS_P): New define.
>>
>>       * config/avr/avr.md (unspec): Add UNSPEC_LPM.
>>       (load_<mode>_libgcc): Use UNSPEC_LPM instead of MEM.
>>       (mov<mode>): For multi-byte move from non-generic
>>       16-bit address spaces: Expand to use Z++ as address for
>>       inline code and use UNSPEC_LPM (Z) for code from libgcc.
>>       (load<mode>_libgcc): Remove expander.
>>       (split-lpmx): Remove split.
>

Approved.

Denis.

Reply via email to