From 11da511c784eca003deb90c23570f0873954e0de Mon Sep 17 00:00:00 2001 From: Duncan Wilkie Date: Sat, 18 Nov 2023 06:11:09 -0600 Subject: Initial commit. --- gmp-6.3.0/tests/arm32call.asm | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 gmp-6.3.0/tests/arm32call.asm (limited to 'gmp-6.3.0/tests/arm32call.asm') diff --git a/gmp-6.3.0/tests/arm32call.asm b/gmp-6.3.0/tests/arm32call.asm new file mode 100644 index 0000000..24d0739 --- /dev/null +++ b/gmp-6.3.0/tests/arm32call.asm @@ -0,0 +1,83 @@ +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() -- cgit v1.2.3