1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan sysv.S - Copyright (c) 2004 Renesas Technology 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan M32R Foreign Function Interface 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 7*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 8*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 9*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 10*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 11*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 12*1fd5a2e1SPrashanth Swaminathan the following conditions: 13*1fd5a2e1SPrashanth Swaminathan 14*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 15*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 16*1fd5a2e1SPrashanth Swaminathan 17*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS 18*1fd5a2e1SPrashanth Swaminathan OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 20*1fd5a2e1SPrashanth Swaminathan IN NO EVENT SHALL RENESAS TECHNOLOGY BE LIABLE FOR ANY CLAIM, DAMAGES OR 21*1fd5a2e1SPrashanth Swaminathan OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22*1fd5a2e1SPrashanth Swaminathan ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23*1fd5a2e1SPrashanth Swaminathan OTHER DEALINGS IN THE SOFTWARE. 24*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 25*1fd5a2e1SPrashanth Swaminathan 26*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 27*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 28*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 29*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_MACHINE_ASM_H 30*1fd5a2e1SPrashanth Swaminathan#include <machine/asm.h> 31*1fd5a2e1SPrashanth Swaminathan#else 32*1fd5a2e1SPrashanth Swaminathan/* XXX these lose for some platforms, I'm sure. */ 33*1fd5a2e1SPrashanth Swaminathan#define CNAME(x) x 34*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x)! .type CNAME(x),%function! CNAME(x): 35*1fd5a2e1SPrashanth Swaminathan#endif 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan.text 38*1fd5a2e1SPrashanth Swaminathan 39*1fd5a2e1SPrashanth Swaminathan /* R0: ffi_prep_args */ 40*1fd5a2e1SPrashanth Swaminathan /* R1: &ecif */ 41*1fd5a2e1SPrashanth Swaminathan /* R2: cif->bytes */ 42*1fd5a2e1SPrashanth Swaminathan /* R3: fig->flags */ 43*1fd5a2e1SPrashanth Swaminathan /* sp+0: ecif.rvalue */ 44*1fd5a2e1SPrashanth Swaminathan /* sp+4: fn */ 45*1fd5a2e1SPrashanth Swaminathan 46*1fd5a2e1SPrashanth Swaminathan /* This assumes we are using gas. */ 47*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_SYSV) 48*1fd5a2e1SPrashanth Swaminathan /* Save registers. */ 49*1fd5a2e1SPrashanth Swaminathan push fp 50*1fd5a2e1SPrashanth Swaminathan push lr 51*1fd5a2e1SPrashanth Swaminathan push r3 52*1fd5a2e1SPrashanth Swaminathan push r2 53*1fd5a2e1SPrashanth Swaminathan push r1 54*1fd5a2e1SPrashanth Swaminathan push r0 55*1fd5a2e1SPrashanth Swaminathan mv fp, sp 56*1fd5a2e1SPrashanth Swaminathan 57*1fd5a2e1SPrashanth Swaminathan /* Make room for all of the new args. */ 58*1fd5a2e1SPrashanth Swaminathan sub sp, r2 59*1fd5a2e1SPrashanth Swaminathan 60*1fd5a2e1SPrashanth Swaminathan /* Place all of the ffi_prep_args in position. */ 61*1fd5a2e1SPrashanth Swaminathan mv lr, r0 62*1fd5a2e1SPrashanth Swaminathan mv r0, sp 63*1fd5a2e1SPrashanth Swaminathan /* R1 already set. */ 64*1fd5a2e1SPrashanth Swaminathan 65*1fd5a2e1SPrashanth Swaminathan /* And call. */ 66*1fd5a2e1SPrashanth Swaminathan jl lr 67*1fd5a2e1SPrashanth Swaminathan 68*1fd5a2e1SPrashanth Swaminathan /* Move first 4 parameters in registers... */ 69*1fd5a2e1SPrashanth Swaminathan ld r0, @(0,sp) 70*1fd5a2e1SPrashanth Swaminathan ld r1, @(4,sp) 71*1fd5a2e1SPrashanth Swaminathan ld r2, @(8,sp) 72*1fd5a2e1SPrashanth Swaminathan ld r3, @(12,sp) 73*1fd5a2e1SPrashanth Swaminathan 74*1fd5a2e1SPrashanth Swaminathan /* ...and adjust the stack. */ 75*1fd5a2e1SPrashanth Swaminathan ld lr, @(8,fp) 76*1fd5a2e1SPrashanth Swaminathan cmpi lr, #16 77*1fd5a2e1SPrashanth Swaminathan bc adjust_stack 78*1fd5a2e1SPrashanth Swaminathan ldi lr, #16 79*1fd5a2e1SPrashanth Swaminathanadjust_stack: 80*1fd5a2e1SPrashanth Swaminathan add sp, lr 81*1fd5a2e1SPrashanth Swaminathan 82*1fd5a2e1SPrashanth Swaminathan /* Call the function. */ 83*1fd5a2e1SPrashanth Swaminathan ld lr, @(28,fp) 84*1fd5a2e1SPrashanth Swaminathan jl lr 85*1fd5a2e1SPrashanth Swaminathan 86*1fd5a2e1SPrashanth Swaminathan /* Remove the space we pushed for the args. */ 87*1fd5a2e1SPrashanth Swaminathan mv sp, fp 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathan /* Load R2 with the pointer to storage for the return value. */ 90*1fd5a2e1SPrashanth Swaminathan ld r2, @(24,sp) 91*1fd5a2e1SPrashanth Swaminathan 92*1fd5a2e1SPrashanth Swaminathan /* Load R3 with the return type code. */ 93*1fd5a2e1SPrashanth Swaminathan ld r3, @(12,sp) 94*1fd5a2e1SPrashanth Swaminathan 95*1fd5a2e1SPrashanth Swaminathan /* If the return value pointer is NULL, assume no return value. */ 96*1fd5a2e1SPrashanth Swaminathan beqz r2, epilogue 97*1fd5a2e1SPrashanth Swaminathan 98*1fd5a2e1SPrashanth Swaminathan /* Return INT. */ 99*1fd5a2e1SPrashanth Swaminathan ldi r4, #FFI_TYPE_INT 100*1fd5a2e1SPrashanth Swaminathan bne r3, r4, return_double 101*1fd5a2e1SPrashanth Swaminathan st r0, @r2 102*1fd5a2e1SPrashanth Swaminathan bra epilogue 103*1fd5a2e1SPrashanth Swaminathan 104*1fd5a2e1SPrashanth Swaminathanreturn_double: 105*1fd5a2e1SPrashanth Swaminathan /* Return DOUBLE or LONGDOUBLE. */ 106*1fd5a2e1SPrashanth Swaminathan ldi r4, #FFI_TYPE_DOUBLE 107*1fd5a2e1SPrashanth Swaminathan bne r3, r4, epilogue 108*1fd5a2e1SPrashanth Swaminathan st r0, @r2 109*1fd5a2e1SPrashanth Swaminathan st r1, @(4,r2) 110*1fd5a2e1SPrashanth Swaminathan 111*1fd5a2e1SPrashanth Swaminathanepilogue: 112*1fd5a2e1SPrashanth Swaminathan pop r0 113*1fd5a2e1SPrashanth Swaminathan pop r1 114*1fd5a2e1SPrashanth Swaminathan pop r2 115*1fd5a2e1SPrashanth Swaminathan pop r3 116*1fd5a2e1SPrashanth Swaminathan pop lr 117*1fd5a2e1SPrashanth Swaminathan pop fp 118*1fd5a2e1SPrashanth Swaminathan jmp lr 119*1fd5a2e1SPrashanth Swaminathan 120*1fd5a2e1SPrashanth Swaminathan.ffi_call_SYSV_end: 121*1fd5a2e1SPrashanth Swaminathan .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) 122