Patchwork : PR49868: Named address space support for AVR, #4

login
register
mail settings
Submitter Georg-Johann Lay
Date Nov. 14, 2011, 8:20 p.m.
Message ID <4EC17808.2010200@gjlay.de>
Download mbox | patch
Permalink /patch/125603/
State New
Headers show

Comments

Georg-Johann Lay - Nov. 14, 2011, 8:20 p.m.
Denis Chertykov wrote:

> Let's wait for
> http://gcc.gnu.org/ml/gcc-patches/2011-10/msg01874.html

As that patch is now upstream, here the updated version.

Difference to the prior implementation of AS1 is:

o If no LPMX instruction is available and more than 2 bytes
  have to be loaded, a libgcc call is used.  This also makes
  the implementation simpler.


o Some functions are more general than actually needed.
  This will reduce the number of changes for the 24-bit
  address spaces.

o There are 2 new predicates to filter out loads from
  non-generic address space. This is needed in shift
  insns for example because they allow mem.

Tested without regressions.

Ok for trunk?

Johann

gcc/
	PR target/49868
	* config/avr/avr.h (ADDR_SPACE_PGM): New address spaces.
	(REGISTER_TARGET_PRAGMAS): New define.
	* config/avr/avr-protos.h (avr_mem_pgm_p): New.
	(avr_load_libgcc_p): New.
	(asm_output_external_libcall): Remove.
	(avr_register_target_pragmas): New.
	(avr_log_t): Add field "progmem".  Order alphabetically.
	* config/avr/avr-log.c (avr_log_set_avr_log): Set avr_log.progmem.
	* config/avr/avr-c.c (langhooks.h): New include.
	(avr_register_target_pragmas): New function. Register address
	space __pgm.
	(avr_cpu_cpp_builtins): Add built-in define __PGM.
	* config/avr/avr-devices.c (avr_arch_types): Set field n_segments.
	
	* config/avr/avr.c: Include "c-family/c-common.h".
	(TARGET_LEGITIMATE_ADDRESS_P): Remove define.
	(TARGET_LEGITIMIZE_ADDRESS): Remove define.
	(TARGET_ADDR_SPACE_SUBSET_P): Define to...
	(avr_addr_space_subset_p): ...this new static function.
	(TARGET_ADDR_SPACE_CONVERT): Define to...
	(avr_addr_space_convert): ...this new static function.
	(TARGET_ADDR_SPACE_ADDRESS_MODE): Define to...
	(avr_addr_space_address_mode): ...this new static function.
	(TARGET_ADDR_SPACE_POINTER_MODE): Define to...
	(avr_addr_space_pointer_mode): ...this new static function.
	(TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P): Define to...
	(avr_addr_space_legitimate_address_p): ...this new static function.
	(TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS): Define to...
	(avr_addr_space_legitimize_address): ...this new static function.
	(avr_mode_code_base_reg_class): Handle address spaces.
	(avr_regno_mode_code_ok_for_base_p): Ditto.
	(lpm_addr_reg_rtx, lpm_reg_rtx, all_regs_rtx): New static variables.
	(avr_option_override): Initialize them.
	(output_reload_in_const): Use all_regs_rtx. Fix signedness of loop
	variables.
	(avr_pgm_segment): New static function.
	(avr_decl_pgm_p, avr_mem_pgm_p): New static functions.
	(avr_out_lpm, avr_out_lpm_no_lpmx): New static functions.
	(output_movqi, output_movhi, output_movsisf, avr_out_movpsi): Call
	avr_out_lpm to handle loads from progmem.
	(avr_load_libgcc_p): New static function.
	(avr_progmem_p): Test if decl is in flash.
	(avr_pgm_pointer_const_p): New static function.
	(avr_nonconst_pointer_addrspace): New static function.
	(avr_pgm_check_var_decl): New static function.
	(avr_insert_attributes): Use it.  Change error message to report
	cause (progmem or address space) when code wants to write to flash.
	(avr_section_type_flags): Unset section flag SECTION_BSS for
	data in progmem.
	
	* config/avr/predicates.md (nop_general_operand): New predicate.
	(nox_general_operand): New predicate.
	* config/avr/avr.md (LPM_REGNO): New define_constant.
	(load<mode>_libgcc): New expander.
	(*load.<mode>.libgcc): New insn.
	(mov<mode>): Handle loads from non-generic AS.
	(movmemhi): Ditto.  Propagate address space information to newly
	created MEM.
	(movqi_insn, *movhi, *movpsi, *movsi, *movsf): Change predicate #1
	to nox_general_operand.
	(ashrqi3, ashrhi3, ashrsi3): Change predicate #1 to nop_general_operand.
	(ashlqi3, *ashlqi3, ashlhi3, ashlsi3): Ditto.
	(lshrqi3, *lshrqi3, lshrhi3, lshrsi3): Ditto.
	(split-lpmx): New split.
	(*ashlhi3_const, *ashlsi3_const, *ashrhi3_const, *ashrsi3_const,
	*lshrhi3_const, *lshrsi3_const): Indent, unquote C.

libgcc/
	PR target/49868
	* config/avr/t-avr (LIB1ASMFUNCS): Add _load_3,  _load_4.
	* config/avr/lib1funcs.S (__load_3, __load_4, __xload_2): New functions.
Denis Chertykov - Nov. 15, 2011, 4:39 a.m.
2011/11/15 Georg-Johann Lay <avr@gjlay.de>:
> Denis Chertykov wrote:
>
>> Let's wait for
>> http://gcc.gnu.org/ml/gcc-patches/2011-10/msg01874.html
>
> As that patch is now upstream, here the updated version.
>
> Difference to the prior implementation of AS1 is:
>
> o If no LPMX instruction is available and more than 2 bytes
>  have to be loaded, a libgcc call is used.  This also makes
>  the implementation simpler.
>
>
> o Some functions are more general than actually needed.
>  This will reduce the number of changes for the 24-bit
>  address spaces.
>
> o There are 2 new predicates to filter out loads from
>  non-generic address space. This is needed in shift
>  insns for example because they allow mem.
>
> Tested without regressions.
>
> Ok for trunk?
>
> Johann
>
> gcc/
>        PR target/49868
>        * config/avr/avr.h (ADDR_SPACE_PGM): New address spaces.
>        (REGISTER_TARGET_PRAGMAS): New define.
>        * config/avr/avr-protos.h (avr_mem_pgm_p): New.
>        (avr_load_libgcc_p): New.
>        (asm_output_external_libcall): Remove.
>        (avr_register_target_pragmas): New.
>        (avr_log_t): Add field "progmem".  Order alphabetically.
>        * config/avr/avr-log.c (avr_log_set_avr_log): Set avr_log.progmem.
>        * config/avr/avr-c.c (langhooks.h): New include.
>        (avr_register_target_pragmas): New function. Register address
>        space __pgm.
>        (avr_cpu_cpp_builtins): Add built-in define __PGM.
>        * config/avr/avr-devices.c (avr_arch_types): Set field n_segments.
>
>        * config/avr/avr.c: Include "c-family/c-common.h".
>        (TARGET_LEGITIMATE_ADDRESS_P): Remove define.
>        (TARGET_LEGITIMIZE_ADDRESS): Remove define.
>        (TARGET_ADDR_SPACE_SUBSET_P): Define to...
>        (avr_addr_space_subset_p): ...this new static function.
>        (TARGET_ADDR_SPACE_CONVERT): Define to...
>        (avr_addr_space_convert): ...this new static function.
>        (TARGET_ADDR_SPACE_ADDRESS_MODE): Define to...
>        (avr_addr_space_address_mode): ...this new static function.
>        (TARGET_ADDR_SPACE_POINTER_MODE): Define to...
>        (avr_addr_space_pointer_mode): ...this new static function.
>        (TARGET_ADDR_SPACE_LEGITIMATE_ADDRESS_P): Define to...
>        (avr_addr_space_legitimate_address_p): ...this new static function.
>        (TARGET_ADDR_SPACE_LEGITIMIZE_ADDRESS): Define to...
>        (avr_addr_space_legitimize_address): ...this new static function.
>        (avr_mode_code_base_reg_class): Handle address spaces.
>        (avr_regno_mode_code_ok_for_base_p): Ditto.
>        (lpm_addr_reg_rtx, lpm_reg_rtx, all_regs_rtx): New static variables.
>        (avr_option_override): Initialize them.
>        (output_reload_in_const): Use all_regs_rtx. Fix signedness of loop
>        variables.
>        (avr_pgm_segment): New static function.
>        (avr_decl_pgm_p, avr_mem_pgm_p): New static functions.
>        (avr_out_lpm, avr_out_lpm_no_lpmx): New static functions.
>        (output_movqi, output_movhi, output_movsisf, avr_out_movpsi): Call
>        avr_out_lpm to handle loads from progmem.
>        (avr_load_libgcc_p): New static function.
>        (avr_progmem_p): Test if decl is in flash.
>        (avr_pgm_pointer_const_p): New static function.
>        (avr_nonconst_pointer_addrspace): New static function.
>        (avr_pgm_check_var_decl): New static function.
>        (avr_insert_attributes): Use it.  Change error message to report
>        cause (progmem or address space) when code wants to write to flash.
>        (avr_section_type_flags): Unset section flag SECTION_BSS for
>        data in progmem.
>
>        * config/avr/predicates.md (nop_general_operand): New predicate.
>        (nox_general_operand): New predicate.
>        * config/avr/avr.md (LPM_REGNO): New define_constant.
>        (load<mode>_libgcc): New expander.
>        (*load.<mode>.libgcc): New insn.
>        (mov<mode>): Handle loads from non-generic AS.
>        (movmemhi): Ditto.  Propagate address space information to newly
>        created MEM.
>        (movqi_insn, *movhi, *movpsi, *movsi, *movsf): Change predicate #1
>        to nox_general_operand.
>        (ashrqi3, ashrhi3, ashrsi3): Change predicate #1 to nop_general_operand.
>        (ashlqi3, *ashlqi3, ashlhi3, ashlsi3): Ditto.
>        (lshrqi3, *lshrqi3, lshrhi3, lshrsi3): Ditto.
>        (split-lpmx): New split.
>        (*ashlhi3_const, *ashlsi3_const, *ashrhi3_const, *ashrsi3_const,
>        *lshrhi3_const, *lshrsi3_const): Indent, unquote C.
>
> libgcc/
>        PR target/49868
>        * config/avr/t-avr (LIB1ASMFUNCS): Add _load_3,  _load_4.
>        * config/avr/lib1funcs.S (__load_3, __load_4, __xload_2): New functions.
>


Please commit.

Denis.

Patch

Index: ../libgcc/config/avr/lib1funcs.S
===================================================================
--- ../libgcc/config/avr/lib1funcs.S	(revision 181349)
+++ ../libgcc/config/avr/lib1funcs.S	(working copy)
@@ -1181,6 +1181,52 @@  DEFUN __tablejump_elpm__
 ENDF __tablejump_elpm__
 #endif /* defined (L_tablejump_elpm) */
 
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Loading n bytes from Flash; n = 3,4
+;; R22... = Flash[Z]
+;; Clobbers: __tmp_reg__
+
+#if (defined (L_load_3)        \
+     || defined (L_load_4))    \
+    && !defined (__AVR_HAVE_LPMX__)
+
+;; Destination
+#define D0  22
+#define D1  D0+1
+#define D2  D0+2
+#define D3  D0+3
+
+.macro  .load dest, n
+    lpm
+    mov     \dest, r0
+.if \dest != D0+\n-1
+    adiw    r30, 1
+.else
+    sbiw    r30, \n-1
+.endif
+.endm
+
+#if defined (L_load_3)
+DEFUN __load_3
+    push  D3
+    XCALL __load_4
+    pop   D3
+    ret
+ENDF __load_3
+#endif /* L_load_3 */
+
+#if defined (L_load_4)
+DEFUN __load_4
+    .load D0, 4
+    .load D1, 4
+    .load D2, 4
+    .load D3, 4
+    ret
+ENDF __load_4
+#endif /* L_load_4 */
+
+#endif /* L_load_3 || L_load_3 */
+
 
 .section .text.libgcc.builtins, "ax", @progbits
 
Index: ../libgcc/config/avr/t-avr
===================================================================
--- ../libgcc/config/avr/t-avr	(revision 181349)
+++ ../libgcc/config/avr/t-avr	(working copy)
@@ -21,6 +21,7 @@  LIB1ASMFUNCS = \
 	_cleanup \
 	_tablejump \
 	_tablejump_elpm \
+	_load_3 _load_4 \
 	_copy_data \
 	_clear_bss \
 	_ctors \