github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/arm32call.asm (about)

     1  dnl  ARM32 calling conventions checking.
     2  
     3  dnl  Copyright 2000, 2003, 2004, 2006, 2007, 2010, 2013 Free Software
     4  dnl  Foundation, Inc.
     5  
     6  dnl  This file is part of the GNU MP Library test suite.
     7  
     8  dnl  The GNU MP Library test suite is free software; you can redistribute it
     9  dnl  and/or modify it under the terms of the GNU General Public License as
    10  dnl  published by the Free Software Foundation; either version 3 of the
    11  dnl  License, or (at your option) any later version.
    12  
    13  dnl  The GNU MP Library test suite is distributed in the hope that it will be
    14  dnl  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    15  dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
    16  dnl  Public License for more details.
    17  
    18  dnl  You should have received a copy of the GNU General Public License along
    19  dnl  with the GNU MP Library test suite.  If not, see
    20  dnl  https://www.gnu.org/licenses/.
    21  
    22  
    23  dnl  The current version of the code attempts to keep the call/return
    24  dnl  prediction stack valid, but matching calls and returns.
    25  
    26  include(`../config.m4')
    27  
    28  
    29  C int calling_conventions (...);
    30  C
    31  C The global variable "calling_conventions_function" is the function to
    32  C call, with the arguments as passed here.
    33  
    34  define(`WANT_CALLEE_SAVES',	eval(4*0))
    35  define(`SAVE_CALLEE_SAVES',	eval(4*8))
    36  define(`RETADDR',		eval(4*16))
    37  define(`GOT_CALLEE_SAVES',	eval(4*17))
    38  define(`JUNK_PARAMS',		eval(4*25))
    39  
    40  	TEXT
    41  	ALIGN(32)
    42  PROLOGUE(calling_conventions)
    43  	LEA(	r12, calling_conventions_values)
    44  
    45  	C Preserve callee-saves registers, including the link register r14
    46  	add	r12, r12, #SAVE_CALLEE_SAVES
    47  	stm	r12, {r4-r11,r14}
    48  	sub	r12, r12, #SAVE_CALLEE_SAVES
    49  
    50  	C Put chosen junk into callee-saves registers
    51  	add	r12, r12, #WANT_CALLEE_SAVES
    52  	ldm	r12, {r4-r11}
    53  	sub	r12, r12, #WANT_CALLEE_SAVES
    54  
    55  	C No callee-saves registers on arm except r12 and parameter registers
    56  	C
    57  
    58  	C Make the actual call
    59  	LEA(	r12, calling_conventions_function)
    60  	ldr	r12, [r12]
    61  	mov	r14, pc
    62  	ret	r12
    63  
    64  	LEA(	r12, calling_conventions_values)
    65  
    66  	C Save callee-saves registers after call
    67  	add	r12, r12, #GOT_CALLEE_SAVES
    68  	stm	r12, {r4-r11}
    69  	sub	r12, r12, #GOT_CALLEE_SAVES
    70  
    71  	C Restore callee-saves registers, including the link register r14
    72  	add	r12, r12, #SAVE_CALLEE_SAVES
    73  	ldm	r12, {r4-r11,r14}
    74  	sub	r12, r12, #SAVE_CALLEE_SAVES
    75  
    76  	C Overwrite parameter registers.  Note that we overwrite r1, which
    77  	C could hold one half of a 64-bit return value, since we don't use that
    78  	C in GMP.
    79  	add	r12, r12, #JUNK_PARAMS
    80  	ldm	r12, {r1-r3}
    81  
    82  	ret	r14
    83  EPILOGUE()