2011/11/20 Georg-Johann Lay <a...@gjlay.de>:
> Denis Chertykov wrote:
>> 2011/11/20 Georg-Johann Lay <.....>:
>>> Subtracting 0x20 to get the SFR address from a RAM address is scattered all
>>> over the backend.  The patch makes - PRINT_OPERAND_PUNCT_VALID_P and uses 
>>> %- to
>>> subtract the SFR offset instead of hard coded magic number 0x20 all over the
>>> place.  The offset is stored in a new field base_arch_s.sfr_offset
>>
>> I don't like '%-' as a sequence and I don't like it as a suffix.
>> May be a right way is an adding a new prefix '%i' or '%I'.
>> I.e.
>>   %m0 - memory address
>>   %i0 - io address (equal to %m0 - 0x20)
>>
>> Denis.
>
> hmmm. The intention was to be able to specify SFR offset in inline assembly,
> for example. The offset is independent of operands; it is a specific to the
> architecture.
>
> Anyway, here is a updated patch. Its the same as the last except that it
> implements %i instead of %- and avr_out_plus_1 prints constants more
> eye-friendly. And there was a missing return close to the end of 
> out_movqi_mr_r.
>
> Passes test suite.
>
> Ok?
>
> Johann
>
>        * config/avr/avr.h (struct base_arch_s): Add field sfr_offset.
>        * config/avr/avr-devices.c: Ditto. And initialize it.
>        * config/avr/avr-c.c (avr_cpu_cpp_builtins): New built-in define
>        __AVR_SFR_OFFSET__.
>        * config/avr/avr-protos.h (out_movqi_r_mr, out_movqi_mr_r): Remove.
>        (out_movhi_r_mr, out_movhi_mr_r): Remove.
>        (out_movsi_r_mr, out_movsi_mr_r): Remove.
>        * config/avr/avr.md (*cbi, *sbi): Use %i instead of %m-0x20.
>        (*insv.io, *insv.not.io): Ditto.
>        * config/avr/avr.c (out_movsi_r_mr, out_movsi_mr_r): Make static.
>        (print_operand): Implement "%i" to print address as I/O address.
>        (output_movqi): Clean up call of out_movqi_mr_r.
>        (output_movhi): Clean up call of out_movhi_mr_r.
>        (avr_file_start): Use avr_current_arch->sfr_offset instead of
>        magic -0x20. Use TMP_REGNO, ZERO_REGNO instead of 0, 1.
>        (avr_out_sbxx_branch): Use %i instead of %m-0x20.
>        (out_movqi_r_mr, out_movqi_mr_r): Ditto. And make static.
>        (out_movhi_r_mr, out_movhi_mr_r): Ditto. And use avr_asm_len.
>        (out_shift_with_cnt): Clean up code: Use avr_asm_len.
>        (output_movsisf): Use output_reload_insisf for all CONSTANT_P sources.
>        (avr_out_movpsi): USE avr_out_reload_inpsi for all CONSTANT_P sources.
>        Clean up call of avr_out_store_psi.
>        (output_reload_in_const): Don't cut symbols longer than 2 bytes.
>        (output_reload_insisf): Filter CONST_INT_P or CONST_DOUBLE_P to
>        try if setting pre-cleared register is advantageous.
>        (avr_out_plus_1): Use gen_int_mode instead of GEN_INT.
>

Approved.

Denis.

Reply via email to