1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan ARCompact 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#define CNAME(x) x 33*1fd5a2e1SPrashanth Swaminathan#define ENTRY(x) .globl CNAME(x)` .type CNAME(x),%function` CNAME(x): 34*1fd5a2e1SPrashanth Swaminathan#endif 35*1fd5a2e1SPrashanth Swaminathan 36*1fd5a2e1SPrashanth Swaminathan.text 37*1fd5a2e1SPrashanth Swaminathan 38*1fd5a2e1SPrashanth Swaminathan /* R0: ffi_prep_args */ 39*1fd5a2e1SPrashanth Swaminathan /* R1: &ecif */ 40*1fd5a2e1SPrashanth Swaminathan /* R2: cif->bytes */ 41*1fd5a2e1SPrashanth Swaminathan /* R3: fig->flags */ 42*1fd5a2e1SPrashanth Swaminathan /* R4: ecif.rvalue */ 43*1fd5a2e1SPrashanth Swaminathan /* R5: fn */ 44*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_call_ARCompact) 45*1fd5a2e1SPrashanth Swaminathan /* Save registers. */ 46*1fd5a2e1SPrashanth Swaminathan st.a fp, [sp, -4] /* fp + 20, fp */ 47*1fd5a2e1SPrashanth Swaminathan push_s blink /* fp + 16, blink */ 48*1fd5a2e1SPrashanth Swaminathan st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */ 49*1fd5a2e1SPrashanth Swaminathan push_s r3 /* fp + 8, fig->flags */ 50*1fd5a2e1SPrashanth Swaminathan st.a r5, [sp, -4] /* fp + 4, fn */ 51*1fd5a2e1SPrashanth Swaminathan push_s r2 /* fp + 0, cif->bytes */ 52*1fd5a2e1SPrashanth Swaminathan mov fp, sp 53*1fd5a2e1SPrashanth Swaminathan 54*1fd5a2e1SPrashanth Swaminathan /* Make room for all of the new args. */ 55*1fd5a2e1SPrashanth Swaminathan sub sp, sp, r2 56*1fd5a2e1SPrashanth Swaminathan 57*1fd5a2e1SPrashanth Swaminathan /* Place all of the ffi_prep_args in position. */ 58*1fd5a2e1SPrashanth Swaminathan /* ffi_prep_args(char *stack, extended_cif *ecif) */ 59*1fd5a2e1SPrashanth Swaminathan /* R1 already set. */ 60*1fd5a2e1SPrashanth Swaminathan 61*1fd5a2e1SPrashanth Swaminathan /* And call. */ 62*1fd5a2e1SPrashanth Swaminathan jl_s.d [r0] 63*1fd5a2e1SPrashanth Swaminathan mov_s r0, sp 64*1fd5a2e1SPrashanth Swaminathan 65*1fd5a2e1SPrashanth Swaminathan ld.ab r12, [fp, 4] /* cif->bytes */ 66*1fd5a2e1SPrashanth Swaminathan ld.ab r11, [fp, 4] /* fn */ 67*1fd5a2e1SPrashanth Swaminathan 68*1fd5a2e1SPrashanth Swaminathan /* Move first 8 parameters in registers... */ 69*1fd5a2e1SPrashanth Swaminathan ld_s r0, [sp] 70*1fd5a2e1SPrashanth Swaminathan ld_s r1, [sp, 4] 71*1fd5a2e1SPrashanth Swaminathan ld_s r2, [sp, 8] 72*1fd5a2e1SPrashanth Swaminathan ld_s r3, [sp, 12] 73*1fd5a2e1SPrashanth Swaminathan ld r4, [sp, 16] 74*1fd5a2e1SPrashanth Swaminathan ld r5, [sp, 20] 75*1fd5a2e1SPrashanth Swaminathan ld r6, [sp, 24] 76*1fd5a2e1SPrashanth Swaminathan ld r7, [sp, 28] 77*1fd5a2e1SPrashanth Swaminathan 78*1fd5a2e1SPrashanth Swaminathan /* ...and adjust the stack. */ 79*1fd5a2e1SPrashanth Swaminathan min r12, r12, 32 80*1fd5a2e1SPrashanth Swaminathan 81*1fd5a2e1SPrashanth Swaminathan /* Call the function. */ 82*1fd5a2e1SPrashanth Swaminathan jl.d [r11] 83*1fd5a2e1SPrashanth Swaminathan add sp, sp, r12 84*1fd5a2e1SPrashanth Swaminathan 85*1fd5a2e1SPrashanth Swaminathan mov sp, fp 86*1fd5a2e1SPrashanth Swaminathan pop_s r3 /* fig->flags, return type */ 87*1fd5a2e1SPrashanth Swaminathan pop_s r2 /* ecif.rvalue, pointer for return value */ 88*1fd5a2e1SPrashanth Swaminathan 89*1fd5a2e1SPrashanth Swaminathan /* If the return value pointer is NULL, assume no return value. */ 90*1fd5a2e1SPrashanth Swaminathan breq.d r2, 0, epilogue 91*1fd5a2e1SPrashanth Swaminathan pop_s blink 92*1fd5a2e1SPrashanth Swaminathan 93*1fd5a2e1SPrashanth Swaminathan /* Return INT. */ 94*1fd5a2e1SPrashanth Swaminathan brne r3, FFI_TYPE_INT, return_double 95*1fd5a2e1SPrashanth Swaminathan b.d epilogue 96*1fd5a2e1SPrashanth Swaminathan st_s r0, [r2] 97*1fd5a2e1SPrashanth Swaminathan 98*1fd5a2e1SPrashanth Swaminathanreturn_double: 99*1fd5a2e1SPrashanth Swaminathan brne r3, FFI_TYPE_DOUBLE, epilogue 100*1fd5a2e1SPrashanth Swaminathan st_s r0, [r2] 101*1fd5a2e1SPrashanth Swaminathan st_s r1, [r2,4] 102*1fd5a2e1SPrashanth Swaminathan 103*1fd5a2e1SPrashanth Swaminathanepilogue: 104*1fd5a2e1SPrashanth Swaminathan j_s.d [blink] 105*1fd5a2e1SPrashanth Swaminathan ld.ab fp, [sp, 4] 106*1fd5a2e1SPrashanth Swaminathan 107*1fd5a2e1SPrashanth SwaminathanENTRY(ffi_closure_ARCompact) 108*1fd5a2e1SPrashanth Swaminathan st.a r0, [sp, -32] 109*1fd5a2e1SPrashanth Swaminathan st_s r1, [sp, 4] 110*1fd5a2e1SPrashanth Swaminathan st_s r2, [sp, 8] 111*1fd5a2e1SPrashanth Swaminathan st_s r3, [sp, 12] 112*1fd5a2e1SPrashanth Swaminathan st r4, [sp, 16] 113*1fd5a2e1SPrashanth Swaminathan st r5, [sp, 20] 114*1fd5a2e1SPrashanth Swaminathan st r6, [sp, 24] 115*1fd5a2e1SPrashanth Swaminathan st r7, [sp, 28] 116*1fd5a2e1SPrashanth Swaminathan 117*1fd5a2e1SPrashanth Swaminathan /* pointer to arguments */ 118*1fd5a2e1SPrashanth Swaminathan mov_s r2, sp 119*1fd5a2e1SPrashanth Swaminathan 120*1fd5a2e1SPrashanth Swaminathan /* return value goes here */ 121*1fd5a2e1SPrashanth Swaminathan sub sp, sp, 8 122*1fd5a2e1SPrashanth Swaminathan mov_s r1, sp 123*1fd5a2e1SPrashanth Swaminathan 124*1fd5a2e1SPrashanth Swaminathan push_s blink 125*1fd5a2e1SPrashanth Swaminathan 126*1fd5a2e1SPrashanth Swaminathan bl.d ffi_closure_inner_ARCompact 127*1fd5a2e1SPrashanth Swaminathan mov_s r0, r8 /* codeloc, set by trampoline */ 128*1fd5a2e1SPrashanth Swaminathan 129*1fd5a2e1SPrashanth Swaminathan pop_s blink 130*1fd5a2e1SPrashanth Swaminathan 131*1fd5a2e1SPrashanth Swaminathan /* set return value to r1:r0 */ 132*1fd5a2e1SPrashanth Swaminathan pop_s r0 133*1fd5a2e1SPrashanth Swaminathan pop_s r1 134*1fd5a2e1SPrashanth Swaminathan j_s.d [blink] 135*1fd5a2e1SPrashanth Swaminathan add_s sp, sp, 32 136