mirror of
https://review.haiku-os.org/buildtools
synced 2025-02-07 14:34:51 +01:00
Change-Id: Iae65e95cfa0d92091b8b0a424ae36d88efa76aa9 Reviewed-on: https://review.haiku-os.org/c/buildtools/+/3020 Reviewed-by: Adrien Destugues <pulkomandy@gmail.com>
84 lines
2.5 KiB
NASM
84 lines
2.5 KiB
NASM
dnl ARM32 calling conventions checking.
|
|
|
|
dnl Copyright 2000, 2003, 2004, 2006, 2007, 2010, 2013, 2016 Free Software
|
|
dnl Foundation, Inc.
|
|
|
|
dnl This file is part of the GNU MP Library test suite.
|
|
|
|
dnl The GNU MP Library test suite is free software; you can redistribute it
|
|
dnl and/or modify it under the terms of the GNU General Public License as
|
|
dnl published by the Free Software Foundation; either version 3 of the
|
|
dnl License, or (at your option) any later version.
|
|
|
|
dnl The GNU MP Library test suite is distributed in the hope that it will be
|
|
dnl useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
dnl Public License for more details.
|
|
|
|
dnl You should have received a copy of the GNU General Public License along
|
|
dnl with the GNU MP Library test suite. If not, see
|
|
dnl https://www.gnu.org/licenses/.
|
|
|
|
|
|
dnl The current version of the code attempts to keep the call/return
|
|
dnl prediction stack valid, but matching calls and returns.
|
|
|
|
include(`../config.m4')
|
|
|
|
|
|
C int calling_conventions (...);
|
|
C
|
|
C The global variable "calling_conventions_function" is the function to
|
|
C call, with the arguments as passed here.
|
|
|
|
define(`WANT_CALLEE_SAVES', eval(4*0))
|
|
define(`SAVE_CALLEE_SAVES', eval(4*8))
|
|
define(`RETADDR', eval(4*16))
|
|
define(`GOT_CALLEE_SAVES', eval(4*17))
|
|
define(`JUNK_PARAMS', eval(4*25))
|
|
|
|
TEXT
|
|
ALIGN(32)
|
|
PROLOGUE(calling_conventions)
|
|
LEA( r12, calling_conventions_values)
|
|
|
|
C Preserve callee-saves registers, including the link register r14
|
|
add r12, r12, #SAVE_CALLEE_SAVES
|
|
stm r12, {r4-r11,r14}
|
|
sub r12, r12, #SAVE_CALLEE_SAVES
|
|
|
|
C Put chosen junk into callee-saves registers
|
|
add r12, r12, #WANT_CALLEE_SAVES
|
|
ldm r12, {r4-r11}
|
|
sub r12, r12, #WANT_CALLEE_SAVES
|
|
|
|
C No callee-saves registers on arm except r12 and parameter registers
|
|
C
|
|
|
|
C Make the actual call
|
|
LEA( r12, calling_conventions_function)
|
|
ldr r12, [r12]
|
|
mov r14, pc
|
|
return r12
|
|
|
|
LEA( r12, calling_conventions_values)
|
|
|
|
C Save callee-saves registers after call
|
|
add r12, r12, #GOT_CALLEE_SAVES
|
|
stm r12, {r4-r11}
|
|
sub r12, r12, #GOT_CALLEE_SAVES
|
|
|
|
C Restore callee-saves registers, including the link register r14
|
|
add r12, r12, #SAVE_CALLEE_SAVES
|
|
ldm r12, {r4-r11,r14}
|
|
sub r12, r12, #SAVE_CALLEE_SAVES
|
|
|
|
C Overwrite parameter registers. Note that we overwrite r1, which
|
|
C could hold one half of a 64-bit return value, since we don't use that
|
|
C in GMP.
|
|
add r12, r12, #JUNK_PARAMS
|
|
ldm r12, {r1-r3}
|
|
|
|
return r14
|
|
EPILOGUE()
|