Applied this overhaul of libf7/asm-defs.h.
Most of the delta deals with factoring out regno functionality
from wmov to an new .macro REGNO.
Johann
--
AVR: Overhaul libf7/asm-defs.h
libgcc/config/avr/libf7/
* asm-defs.h (REGNO): New .macro.
(wmov): Use it.
(do_epilogue_restores) <\n_frame>: Put in () where needed.
diff --git a/libgcc/config/avr/libf7/asm-defs.h b/libgcc/config/avr/libf7/asm-defs.h
index 3eea6b1cf3a..950eada5411 100644
--- a/libgcc/config/avr/libf7/asm-defs.h
+++ b/libgcc/config/avr/libf7/asm-defs.h
@@ -30,6 +30,9 @@
/* Stuff for Assembler-only */
/*****************************************************************/
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Definitions for common SFRs and fixed registers.
+
#if defined (__AVR_TINY__)
#define __tmp_reg__ 16
#define __zero_reg__ 17
@@ -44,24 +47,54 @@
#define __SP_H__ 0x3e
#endif
-#if !defined ASM_DEFS_HAVE_DEFUN
-.macro DEFUN name
- .global \name
- .func \name
- \name:
-.endm
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Helper macros.
-.macro ENDF name
- .size \name, .-\name
- .endfunc
-.endm
+;;; REGNO sets symbol SYM to the register number of REG.
+;;; Valid REGs are: r0..r31, R0..R31 and XL, yh, ZH etc.
+;;; Expressions that evaluate to a number can also be used.
+.macro REGNO sym, reg
+ ..regno.done = 0
+ ..regno = 0
+ .irp name, \
+ r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, \
+ r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
+ r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, \
+ r30, r31, \
+ R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, \
+ R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, \
+ R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, \
+ R30, R31
+ .ifc \name,\reg
+ \sym = ..regno % 32
+ ..regno.done = 1
+ .endif
+ ..regno = ..regno + 1
+ .endr
-.macro LABEL name
- .global \name
- \name:
+ ..regno = 0
+ .irp name, \
+ xl, xh, yl, yh, zl, zh, \
+ Xl, Xh, Yl, Yh, Zl, Zh, \
+ xL, xH, yL, yH, zL, zH, \
+ XL, XH, YL, YH, ZL, ZH, \
+ x, xh, y, yh, z, zh, \
+ X, XH, Y, YH, Z, ZH
+ .ifc \name,\reg
+ \sym = 26 + ..regno % 6
+ ..regno.done = 1
+ .endif
+ ..regno = ..regno + 1
+ .endr
+
+ .if ! ..regno.done
+ ;; Assume that \reg is some valid numeric expression.
+ \sym = \reg
+ .endif
.endm
-#endif /* HAVE_DEFUN */
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Definitions to factor out different ISAs.
#if defined (__AVR_HAVE_JMP_CALL__)
#define XCALL call
@@ -81,87 +114,53 @@
#define PC_SIZE 2
#endif
-.macro skipnext
- cpse r16, r16
-.endm
-
-/*
- Factor out support of MOVW. Usage is like
-
- wmov 30, 24
-
- to move R25:R24 to R31:R30, i.e. plain register numbers
- are required and no register prefix 'R'.
-*/
-
-#if defined (__AVR_HAVE_MOVW__)
-#define wmov movw
+;;; Like MOVW
+.macro wmov dst, src
+ REGNO ..wmov.dst, \dst
+ REGNO ..wmov.src, \src
+#ifdef __AVR_HAVE_MOVW__
+ movw ..wmov.dst, ..wmov.src
#else
- .macro wmov dst src
- ..dst = \dst
- ..src = \src
- ..regno = 0
- .irp reg, \
- r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, \
- r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
- r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, \
- r30, r31
- .ifc \reg,\dst
- ..dst = ..regno
- .endif
- .ifc \reg,\src
- ..src = ..regno
- .endif
- ..regno = ..regno + 1
- .endr
+ mov ..wmov.dst+0, ..wmov.src+0
+ mov ..wmov.dst+1, ..wmov.src+1
+#endif /* __AVR_HAVE_MOVW__ */
+.endm
- ..regno = 0
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Macros for convenience.
- .irp reg, \
- R0, R1, R2, R3, R4, R5, R6, R7, R8, R9, \
- R10, R11, R12, R13, R14, R15, R16, R17, R18, R19, \
- R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, \
- R30, R31
- .ifc \reg,\dst
- ..dst = ..regno
- .endif
- .ifc \reg,\src
- ..src = ..regno
- .endif
- ..regno = ..regno + 1
- .endr
+.macro skipnext
+ cpse r16, r16
+.endm
- ..regno = 0
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;; Function entry and exit.
- .irp reg, \
- X, x, XL, xl, Xl, xL, x, x, \
- Y, y, YL, yl, Yl, yL, y, y, \
- Z, z, ZL, zl, Zl, zL, z, z
- .ifc \reg,\dst
- ..dst = 2 * (..regno / 8) + 26
- .endif
- .ifc \reg,\src
- ..src = 2 * (..regno / 8) + 26
- .endif
- ..regno = ..regno + 1
- .endr
+#if !defined ASM_DEFS_HAVE_DEFUN
+.macro DEFUN name
+ .global \name
+ .func \name
+ \name:
+.endm
- mov ..dst+0, ..src+0
- mov ..dst+1, ..src+1
- .endm
-#endif /* MOVW */
+.macro ENDF name
+ .size \name, .-\name
+ .endfunc
+.endm
+.macro LABEL name
+ .global \name
+ .type \name,@function
+ \name:
+.endm
+#endif /* HAVE_DEFUN */
#if !defined (__AVR_TINY__)
-/*
- Convenience macro for easy use of __prologue_saves__ from libgcc.
- Push the N_PUSHED callee-saved registers Y, R17, R16, R15, ...
- with 0 <= N_PUSHED <= 18. The frame pointer (Y) is set up according
- to a frame size of N_FRAME. Clobbers TMP_REG.
- For the code of __prologue_saves__ from libgcc see
- http://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/config/avr/lib1funcs.S?revision=267494&view=markup#l2159
-*/
+;;; Convenience macro for easy use of __prologue_saves__ from libgcc.
+;;; Push the N_PUSHED callee-saved registers Y, R17, R16, R15, ...
+;;; with 0 <= N_PUSHED <= 18. The frame pointer (Y) is set up according
+;;; to a frame size of N_FRAME. Clobbers TMP_REG. Does not clobber T.
.macro do_prologue_saves n_pushed n_frame=0
ldi r26, lo8(\n_frame)
ldi r27, hi8(\n_frame)
@@ -171,27 +170,22 @@
.L_prologue_saves.\@:
.endm
-/*
- Convenience macro for easy use of __epilogue_restores__ from libgcc.
- Undo the effect of __prologue_saves__. Clobbers TMP_REG.
- For the code of __epilogue_restores__ from libgcc see
- http://gcc.gnu.org/viewcvs/gcc/trunk/libgcc/config/avr/lib1funcs.S?revision=267494&view=markup#l2216
-*/
-
+;;; Convenience macro for easy use of __epilogue_restores__ from libgcc.
+;;; Undo the effect of __prologue_saves__. Clobbers TMP_REG.
.macro do_epilogue_restores n_pushed n_frame=0
in r28, __SP_L__
#ifdef __AVR_HAVE_SPH__
in r29, __SP_H__
.if \n_frame > 63
- subi r28, lo8(-\n_frame)
- sbci r29, hi8(-\n_frame)
+ subi r28, lo8(-(\n_frame))
+ sbci r29, hi8(-(\n_frame))
.elseif \n_frame > 0
adiw r28, \n_frame
.endif
#else
clr r29
.if \n_frame > 0
- subi r28, lo8(-\n_frame)
+ subi r28, lo8(-(\n_frame))
.endif
#endif /* HAVE SPH */
ldi r30, \n_pushed