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

Reply via email to