1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan eabi.S - Copyright (c) 2004 Anthony Green 3*1fd5a2e1SPrashanth Swaminathan 4*1fd5a2e1SPrashanth Swaminathan FR-V Assembly glue. 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 THE AUTHOR 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 30*1fd5a2e1SPrashanth Swaminathan .globl ffi_prep_args_EABI 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan .text 33*1fd5a2e1SPrashanth Swaminathan .p2align 4 34*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_EABI 35*1fd5a2e1SPrashanth Swaminathan .type ffi_call_EABI, @function 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan # gr8 : ffi_prep_args 38*1fd5a2e1SPrashanth Swaminathan # gr9 : &ecif 39*1fd5a2e1SPrashanth Swaminathan # gr10: cif->bytes 40*1fd5a2e1SPrashanth Swaminathan # gr11: fig->flags 41*1fd5a2e1SPrashanth Swaminathan # gr12: ecif.rvalue 42*1fd5a2e1SPrashanth Swaminathan # gr13: fn 43*1fd5a2e1SPrashanth Swaminathan 44*1fd5a2e1SPrashanth Swaminathanffi_call_EABI: 45*1fd5a2e1SPrashanth Swaminathan addi sp, #-80, sp 46*1fd5a2e1SPrashanth Swaminathan sti fp, @(sp, #24) 47*1fd5a2e1SPrashanth Swaminathan addi sp, #24, fp 48*1fd5a2e1SPrashanth Swaminathan movsg lr, gr5 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan /* Make room for the new arguments. */ 51*1fd5a2e1SPrashanth Swaminathan /* subi sp, fp, gr10 */ 52*1fd5a2e1SPrashanth Swaminathan 53*1fd5a2e1SPrashanth Swaminathan /* Store return address and incoming args on stack. */ 54*1fd5a2e1SPrashanth Swaminathan sti gr5, @(fp, #8) 55*1fd5a2e1SPrashanth Swaminathan sti gr8, @(fp, #-4) 56*1fd5a2e1SPrashanth Swaminathan sti gr9, @(fp, #-8) 57*1fd5a2e1SPrashanth Swaminathan sti gr10, @(fp, #-12) 58*1fd5a2e1SPrashanth Swaminathan sti gr11, @(fp, #-16) 59*1fd5a2e1SPrashanth Swaminathan sti gr12, @(fp, #-20) 60*1fd5a2e1SPrashanth Swaminathan sti gr13, @(fp, #-24) 61*1fd5a2e1SPrashanth Swaminathan 62*1fd5a2e1SPrashanth Swaminathan sub sp, gr10, sp 63*1fd5a2e1SPrashanth Swaminathan 64*1fd5a2e1SPrashanth Swaminathan /* Call ffi_prep_args. */ 65*1fd5a2e1SPrashanth Swaminathan ldi @(fp, #-4), gr4 66*1fd5a2e1SPrashanth Swaminathan addi sp, #0, gr8 67*1fd5a2e1SPrashanth Swaminathan ldi @(fp, #-8), gr9 68*1fd5a2e1SPrashanth Swaminathan#ifdef __FRV_FDPIC__ 69*1fd5a2e1SPrashanth Swaminathan ldd @(gr4, gr0), gr14 70*1fd5a2e1SPrashanth Swaminathan calll @(gr14, gr0) 71*1fd5a2e1SPrashanth Swaminathan#else 72*1fd5a2e1SPrashanth Swaminathan calll @(gr4, gr0) 73*1fd5a2e1SPrashanth Swaminathan#endif 74*1fd5a2e1SPrashanth Swaminathan 75*1fd5a2e1SPrashanth Swaminathan /* ffi_prep_args returns the new stack pointer. */ 76*1fd5a2e1SPrashanth Swaminathan mov gr8, gr4 77*1fd5a2e1SPrashanth Swaminathan 78*1fd5a2e1SPrashanth Swaminathan ldi @(sp, #0), gr8 79*1fd5a2e1SPrashanth Swaminathan ldi @(sp, #4), gr9 80*1fd5a2e1SPrashanth Swaminathan ldi @(sp, #8), gr10 81*1fd5a2e1SPrashanth Swaminathan ldi @(sp, #12), gr11 82*1fd5a2e1SPrashanth Swaminathan ldi @(sp, #16), gr12 83*1fd5a2e1SPrashanth Swaminathan ldi @(sp, #20), gr13 84*1fd5a2e1SPrashanth Swaminathan 85*1fd5a2e1SPrashanth Swaminathan /* Always copy the return value pointer into the hidden 86*1fd5a2e1SPrashanth Swaminathan parameter register. This is only strictly necessary 87*1fd5a2e1SPrashanth Swaminathan when we're returning an aggregate type, but it doesn't 88*1fd5a2e1SPrashanth Swaminathan hurt to do this all the time, and it saves a branch. */ 89*1fd5a2e1SPrashanth Swaminathan ldi @(fp, #-20), gr3 90*1fd5a2e1SPrashanth Swaminathan 91*1fd5a2e1SPrashanth Swaminathan /* Use the ffi_prep_args return value for the new sp. */ 92*1fd5a2e1SPrashanth Swaminathan mov gr4, sp 93*1fd5a2e1SPrashanth Swaminathan 94*1fd5a2e1SPrashanth Swaminathan /* Call the target function. */ 95*1fd5a2e1SPrashanth Swaminathan ldi @(fp, -24), gr4 96*1fd5a2e1SPrashanth Swaminathan#ifdef __FRV_FDPIC__ 97*1fd5a2e1SPrashanth Swaminathan ldd @(gr4, gr0), gr14 98*1fd5a2e1SPrashanth Swaminathan calll @(gr14, gr0) 99*1fd5a2e1SPrashanth Swaminathan#else 100*1fd5a2e1SPrashanth Swaminathan calll @(gr4, gr0) 101*1fd5a2e1SPrashanth Swaminathan#endif 102*1fd5a2e1SPrashanth Swaminathan 103*1fd5a2e1SPrashanth Swaminathan /* Store the result. */ 104*1fd5a2e1SPrashanth Swaminathan ldi @(fp, #-16), gr10 /* fig->flags */ 105*1fd5a2e1SPrashanth Swaminathan ldi @(fp, #-20), gr4 /* ecif.rvalue */ 106*1fd5a2e1SPrashanth Swaminathan 107*1fd5a2e1SPrashanth Swaminathan /* Is the return value stored in two registers? */ 108*1fd5a2e1SPrashanth Swaminathan cmpi gr10, #8, icc0 109*1fd5a2e1SPrashanth Swaminathan bne icc0, 0, .L2 110*1fd5a2e1SPrashanth Swaminathan /* Yes, save them. */ 111*1fd5a2e1SPrashanth Swaminathan sti gr8, @(gr4, #0) 112*1fd5a2e1SPrashanth Swaminathan sti gr9, @(gr4, #4) 113*1fd5a2e1SPrashanth Swaminathan bra .L3 114*1fd5a2e1SPrashanth Swaminathan.L2: 115*1fd5a2e1SPrashanth Swaminathan /* Is the return value a structure? */ 116*1fd5a2e1SPrashanth Swaminathan cmpi gr10, #-1, icc0 117*1fd5a2e1SPrashanth Swaminathan beq icc0, 0, .L3 118*1fd5a2e1SPrashanth Swaminathan /* No, save a 4 byte return value. */ 119*1fd5a2e1SPrashanth Swaminathan sti gr8, @(gr4, #0) 120*1fd5a2e1SPrashanth Swaminathan.L3: 121*1fd5a2e1SPrashanth Swaminathan 122*1fd5a2e1SPrashanth Swaminathan /* Restore the stack, and return. */ 123*1fd5a2e1SPrashanth Swaminathan ldi @(fp, 8), gr5 124*1fd5a2e1SPrashanth Swaminathan ld @(fp, gr0), fp 125*1fd5a2e1SPrashanth Swaminathan addi sp,#80,sp 126*1fd5a2e1SPrashanth Swaminathan jmpl @(gr5,gr0) 127*1fd5a2e1SPrashanth Swaminathan .size ffi_call_EABI, .-ffi_call_EABI 128*1fd5a2e1SPrashanth Swaminathan 129