https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118001

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Georg-Johann Lay <g...@gcc.gnu.org>:

https://gcc.gnu.org/g:f8a602ce5394ef7e0c56b48e3bd89f97f0411c45

commit r15-6171-gf8a602ce5394ef7e0c56b48e3bd89f97f0411c45
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Wed Dec 11 13:28:47 2024 +0100

    AVR: target/118001 - Add __flashx as 24-bit named address space.

    This patch adds __flashx as a new named address space that allocates
    objects in .progmemx.data.  The handling is mostly the same or similar
    to that of 24-bit space __memx, except that the asm routines are
    simpler and more efficient.  Loads are emit inline when ELPMX or
    LPMX is available.  The address space uses a 24-bit addresses even
    on devices with a program memory size of 64 KiB or less.

            PR target/118001
    gcc/
            * doc/extend.texi (AVR Named Address Spaces): Document __flashx.
            * config/avr/avr.h (ADDR_SPACE_FLASHX): New enum value.
            * config/avr/avr-protos.h (avr_out_fload, avr_mem_flashx_p)
            (avr_fload_libgcc_p, avr_load_libgcc_mem_p)
            (avr_load_libgcc_insn_p): New.
            * config/avr/avr.cc (avr_addrspace): Add ADDR_SPACE_FLASHX.
            (avr_decl_flashx_p, avr_mem_flashx_p, avr_fload_libgcc_p)
            (avr_load_libgcc_mem_p, avr_load_libgcc_insn_p, avr_out_fload):
            New functions.
            (avr_adjust_insn_length) [ADJUST_LEN_FLOAD]: Handle case.
            (avr_progmem_p) [avr_decl_flashx_p]: return 2.
            (avr_addr_space_legitimate_address_p) [ADDR_SPACE_FLASHX]:
            Has same behavior like ADDR_SPACE_MEMX.
            (avr_addr_space_convert): Use pointer sizes rather then ASes.
            (avr_addr_space_contains): New function.
            (avr_convert_to_type): Use it.
            (avr_emit_cpymemhi): Handle ADDR_SPACE_FLASHX.
            * config/avr/avr.md (adjust_len) <fload>: New attr value.
            (gen_load<mode>_libgcc): Renamed from load<mode>_libgcc.
            (xload8<mode>_A): Iterate over MOVMODE rather than over ALL1.
            (fxmov<mode>_A): New from xloadv<mode>_A.
            (xmov<mode>_8): New from xload<mode>_A.
            (fmov<mode>): New insns.
            (fxload<mode>_A): New from xload<mode>_A.
            (fxload_<mode>_libgcc): New from xload_<mode>_libgcc.
            (*fxload_<mode>_libgcc): New from *xload_<mode>_libgcc.
            (mov<mode>) [avr_mem_flashx_p]: Hande ADDR_SPACE_FLASHX.
            (cpymemx_<mode>): Make sure the address space is not lost
            when splitting.
            (*cpymemx_<mode>) [ADDR_SPACE_FLASHX]: Use __movmemf_<mode> for
asm.
            (*ashlqi.1.zextpsi_split): New combine pattern.
            * config/avr/predicates.md (nox_general_operand): Don't match
            when avr_mem_flashx_p is true.
            * config/avr/avr-passes.cc (AVR_LdSt_Props):
            ADDR_SPACE_FLASHX has no post_inc.

    gcc/testsuite/
            * gcc.target/avr/torture/addr-space-1.h [AVR_HAVE_ELPM]:
            Use a function to bump .progmemx.data to a high address.
            * gcc.target/avr/torture/addr-space-2.h: Same.
            * gcc.target/avr/torture/addr-space-1-fx.c: New test.
            * gcc.target/avr/torture/addr-space-2-fx.c: New test.

    libgcc/
            * config/avr/t-avr (LIB1ASMFUNCS): Add _fload_1, _fload_2,
            _fload_3, _fload_4, _movmemf.
            * config/avr/lib1funcs.S (.branch_plus): New .macro.
            (__xload_1, __xload_2, __xload_3, __xload_4): When the address is
            located in flash, then forward to...
            (__fload_1, __fload_2, __fload_3, __fload_4): ...these new
            functions, respectively.
            (__movmemx_hi): When the address is located in flash, forward to...
            (__movmemf_hi): ...this new function.

Reply via email to