From 7bc6df2ca1e069c9cd2b58d5b0560d2bd7ffe703 Mon Sep 17 00:00:00 2001 From: Georg-Johann Lay Date: Fri, 18 Nov 2011 16:44:00 +0000 Subject: re PR target/49868 (Implement named address space to place/access data in flash memory) gcc/ PR target/49868 * config/avr/avr.h (base_arch_s): Add field n_segments. (ADDR_SPACE_PGM1, ADDR_SPACE_PGM2, ADDR_SPACE_PGM3, ADDR_SPACE_PGM4, ADDR_SPACE_PGM5, ADDR_SPACE_PGMX): New address spaces. (AVR_HAVE_ELPM, AVR_HAVE_ELPMX): New defines. (INIT_EXPANDERS): New define. * config/avr/avr-protos.h (avr_mem_pgmx_p): New. (avr_init_expanders): New. (avr_emit_movmemhi, avr_out_movmem): New. (avr_xload_libgcc_p): New. * config/avr/avr-c.c (avr_register_target_pragmas): Register address spaces __pgm1, __pgm2, __pgm3, __pgm4 __pgm5, __pgmx. (avr_cpu_cpp_builtins): Add built-in defines __PGM1, __PGM2, __PGM3, __PGM4, __PGM5, __PGMX. * config/avr/avr-devices.c (avr_arch_types): Set field n_segments. * config/avr/avr.c (AVR_SECTION_PROGMEM): Change define to cover 3 bits instead of just 1. (xstring_empty, xstring_e, rampz_rtx): New static GTYed variables. (progmem_section): Change from section to array of sections. (progmem_section_prefix): New static variable. (avr_file_start): Print set for __RAMPZ__ (avr_option_override): Move initialization of RTXes from here... (avr_init_expanders): ...to this new function. (avr_pgm_segment): New static function. (avr_decl_pgm_p): Handle error_mark_node. (avr_mem_pgmx_p, avr_decl_pgmx_p): New static functions. (avr_out_xload, avr_find_unused_d_reg): New static functions. (expand_prologue, expand_epilogue): Use rampz_rtx. (print_operand): Hande CONST_STRING. (avr_xload_libgcc_p): New static function. (avr_out_lpm_no_lpmx, avr_out_lpm): Handle ELPM. (avr_progmem_p): Return 2 for 24-bit flash address space. (avr_out_sbxx_branch): Clean-up code from ASn macros. (out_movqi_r_mr, out_movqi_mr_r): Ditto. And recognize RAMPZ's address and print symbolically. (avr_asm_named_section, avr_section_type_flags, avr_encode_section_info, avr_asm_select_section, avr_addr_space_address_mode, avr_addr_space_pointer_mode, avr_addr_space_legitimate_address_p, avr_addr_space_convert, avr_addr_space_legitimize_address): Handle new address spaces. (avr_output_progmem_section_asm_op): New static function. (avr_asm_init_sections): Initialize progmem_section[]. (adjust_insn_length): Handle ADJUST_LEN_XLOAD, ADJUST_LEN_MOVMEM. (avr_const_address_lo16): New static function. (avr_assemble_integer): Use it to handle 3-byte integers. (avr_emit_movmemhi, avr_out_movmem): New functions. * config/avr/predicates.md (nox_general_operand): Handle new address spaces. * config/avr/avr.md (unspec): Add UNSPEC_MOVMEM. (adjust_len): Add xload, movmem. (SP_ADDR): New define_constants. (isa): Add "lpm", "lpmx", "elpm", "elpmx". (enabled): Handle them. (load_libgcc): New expander. (*load..libgcc): Rename to load__libgcc. (xload8_A, xload_A): New insn-and-splits. (xload_8, xload__libgcc, xload_, loadmem_elpm): New insns. (mov): Handle new address spaces. (movmemhi): Rewrite using avr_emit_movmemhi. (MOVMEM_r_d): New mode attribute. (movmem_, movmem_qi_elpm): New insns. (setmemhi, *clrmemqi, *clrmemhi, strlenhi, *strlenhi): Unquote C-code. Use label instead of hard-coded instrunction lengths. libgcc/ PR target/49868 * config/avr/t-avr (LIB1ASMFUNCS): Add _xload_2 _xload_3 _xload_4. * config/avr/lib1funcs.S (__xload_2, __xload_3, __xload_4): New functions. From-SVN: r181482 --- gcc/config/avr/avr.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'gcc/config/avr/avr.h') diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 24a687b..30bca35 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -54,6 +54,9 @@ struct base_arch_s { /* Default start of data section address for architecture. */ int default_data_section_start; + /* Number of 64k segments in the flash. */ + int n_segments; + const char *const macro; /* Architecture name. */ @@ -131,6 +134,8 @@ extern const struct base_arch_s avr_arch_types[]; #define AVR_HAVE_MUL (avr_current_arch->have_mul) #define AVR_HAVE_MOVW (avr_current_arch->have_movw_lpmx) #define AVR_HAVE_LPMX (avr_current_arch->have_movw_lpmx) +#define AVR_HAVE_ELPM (avr_current_arch->have_elpm) +#define AVR_HAVE_ELPMX (avr_current_arch->have_elpmx) #define AVR_HAVE_RAMPZ (avr_current_arch->have_elpm) #define AVR_HAVE_EIJMP_EICALL (avr_current_arch->have_eijmp_eicall) #define AVR_HAVE_8BIT_SP (avr_current_device->short_sp || TARGET_TINY_STACK) @@ -393,6 +398,12 @@ typedef struct avr_args { #define ADDR_SPACE_PGM 1 +#define ADDR_SPACE_PGM1 2 +#define ADDR_SPACE_PGM2 3 +#define ADDR_SPACE_PGM3 4 +#define ADDR_SPACE_PGM4 5 +#define ADDR_SPACE_PGM5 6 +#define ADDR_SPACE_PGMX 7 #define REGISTER_TARGET_PRAGMAS() \ do { \ @@ -645,3 +656,5 @@ struct GTY(()) machine_function #define PUSH_ROUNDING(X) (X) #define ACCUMULATE_OUTGOING_ARGS avr_accumulate_outgoing_args() + +#define INIT_EXPANDERS avr_init_expanders() -- cgit v1.1