https://gcc.gnu.org/g:9a741ea0efe694a9b63a4323261c6ff4517a3a55
commit r17-1533-g9a741ea0efe694a9b63a4323261c6ff4517a3a55 Author: Georg-Johann Lay <[email protected]> Date: Sat Jun 13 18:16:06 2026 +0200 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: --- libgcc/config/avr/libf7/asm-defs.h | 184 ++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 95 deletions(-) diff --git a/libgcc/config/avr/libf7/asm-defs.h b/libgcc/config/avr/libf7/asm-defs.h index 3eea6b1cf3a5..950eada54111 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
