1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan hpux32.S - Copyright (c) 2006 Free Software Foundation, Inc. 3*1fd5a2e1SPrashanth Swaminathan (c) 2008 Red Hat, Inc. 4*1fd5a2e1SPrashanth Swaminathan based on src/pa/linux.S 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan HP-UX PA Foreign Function Interface 7*1fd5a2e1SPrashanth Swaminathan 8*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 9*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 10*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 11*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 12*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 13*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 14*1fd5a2e1SPrashanth Swaminathan the following conditions: 15*1fd5a2e1SPrashanth Swaminathan 16*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 17*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS 20*1fd5a2e1SPrashanth Swaminathan OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 22*1fd5a2e1SPrashanth Swaminathan IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR 23*1fd5a2e1SPrashanth Swaminathan OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 24*1fd5a2e1SPrashanth Swaminathan ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 25*1fd5a2e1SPrashanth Swaminathan OTHER DEALINGS IN THE SOFTWARE. 26*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan#define LIBFFI_ASM 29*1fd5a2e1SPrashanth Swaminathan#include <fficonfig.h> 30*1fd5a2e1SPrashanth Swaminathan#include <ffi.h> 31*1fd5a2e1SPrashanth Swaminathan 32*1fd5a2e1SPrashanth Swaminathan .LEVEL 1.1 33*1fd5a2e1SPrashanth Swaminathan .SPACE $PRIVATE$ 34*1fd5a2e1SPrashanth Swaminathan .IMPORT $global$,DATA 35*1fd5a2e1SPrashanth Swaminathan .IMPORT $$dyncall,MILLICODE 36*1fd5a2e1SPrashanth Swaminathan .SUBSPA $DATA$ 37*1fd5a2e1SPrashanth Swaminathan .align 4 38*1fd5a2e1SPrashanth Swaminathan 39*1fd5a2e1SPrashanth Swaminathan /* void ffi_call_pa32(void (*)(char *, extended_cif *), 40*1fd5a2e1SPrashanth Swaminathan extended_cif *ecif, 41*1fd5a2e1SPrashanth Swaminathan unsigned bytes, 42*1fd5a2e1SPrashanth Swaminathan unsigned flags, 43*1fd5a2e1SPrashanth Swaminathan unsigned *rvalue, 44*1fd5a2e1SPrashanth Swaminathan void (*fn)(void)); 45*1fd5a2e1SPrashanth Swaminathan */ 46*1fd5a2e1SPrashanth Swaminathan 47*1fd5a2e1SPrashanth Swaminathan .export ffi_call_pa32,ENTRY,PRIV_LEV=3 48*1fd5a2e1SPrashanth Swaminathan .import ffi_prep_args_pa32,CODE 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan .SPACE $TEXT$ 51*1fd5a2e1SPrashanth Swaminathan .SUBSPA $CODE$ 52*1fd5a2e1SPrashanth Swaminathan .align 4 53*1fd5a2e1SPrashanth Swaminathan 54*1fd5a2e1SPrashanth SwaminathanL$FB1 55*1fd5a2e1SPrashanth Swaminathanffi_call_pa32 56*1fd5a2e1SPrashanth Swaminathan .proc 57*1fd5a2e1SPrashanth Swaminathan .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=4 58*1fd5a2e1SPrashanth Swaminathan .entry 59*1fd5a2e1SPrashanth Swaminathan stw %rp, -20(%sp) 60*1fd5a2e1SPrashanth Swaminathan copy %r3, %r1 61*1fd5a2e1SPrashanth SwaminathanL$CFI11 62*1fd5a2e1SPrashanth Swaminathan copy %sp, %r3 63*1fd5a2e1SPrashanth SwaminathanL$CFI12 64*1fd5a2e1SPrashanth Swaminathan 65*1fd5a2e1SPrashanth Swaminathan /* Setup the stack for calling prep_args... 66*1fd5a2e1SPrashanth Swaminathan We want the stack to look like this: 67*1fd5a2e1SPrashanth Swaminathan 68*1fd5a2e1SPrashanth Swaminathan [ Previous stack ] <- %r3 69*1fd5a2e1SPrashanth Swaminathan 70*1fd5a2e1SPrashanth Swaminathan [ 64-bytes register save area ] <- %r4 71*1fd5a2e1SPrashanth Swaminathan 72*1fd5a2e1SPrashanth Swaminathan [ Stack space for actual call, passed as ] <- %arg0 73*1fd5a2e1SPrashanth Swaminathan [ arg0 to ffi_prep_args_pa32 ] 74*1fd5a2e1SPrashanth Swaminathan 75*1fd5a2e1SPrashanth Swaminathan [ Stack for calling prep_args ] <- %sp 76*1fd5a2e1SPrashanth Swaminathan */ 77*1fd5a2e1SPrashanth Swaminathan 78*1fd5a2e1SPrashanth Swaminathan stwm %r1, 64(%sp) 79*1fd5a2e1SPrashanth Swaminathan stw %r4, 12(%r3) 80*1fd5a2e1SPrashanth SwaminathanL$CFI13 81*1fd5a2e1SPrashanth Swaminathan copy %sp, %r4 82*1fd5a2e1SPrashanth Swaminathan 83*1fd5a2e1SPrashanth Swaminathan addl %arg2, %r4, %arg0 ; arg stack 84*1fd5a2e1SPrashanth Swaminathan stw %arg3, -48(%r3) ; save flags we need it later 85*1fd5a2e1SPrashanth Swaminathan 86*1fd5a2e1SPrashanth Swaminathan /* Call prep_args: 87*1fd5a2e1SPrashanth Swaminathan %arg0(stack) -- set up above 88*1fd5a2e1SPrashanth Swaminathan %arg1(ecif) -- same as incoming param 89*1fd5a2e1SPrashanth Swaminathan %arg2(bytes) -- same as incoming param */ 90*1fd5a2e1SPrashanth Swaminathan bl ffi_prep_args_pa32,%r2 91*1fd5a2e1SPrashanth Swaminathan ldo 64(%arg0), %sp 92*1fd5a2e1SPrashanth Swaminathan ldo -64(%sp), %sp 93*1fd5a2e1SPrashanth Swaminathan 94*1fd5a2e1SPrashanth Swaminathan /* now %sp should point where %arg0 was pointing. */ 95*1fd5a2e1SPrashanth Swaminathan 96*1fd5a2e1SPrashanth Swaminathan /* Load the arguments that should be passed in registers 97*1fd5a2e1SPrashanth Swaminathan The fp args are loaded by the prep_args function. */ 98*1fd5a2e1SPrashanth Swaminathan ldw -36(%sp), %arg0 99*1fd5a2e1SPrashanth Swaminathan ldw -40(%sp), %arg1 100*1fd5a2e1SPrashanth Swaminathan ldw -44(%sp), %arg2 101*1fd5a2e1SPrashanth Swaminathan ldw -48(%sp), %arg3 102*1fd5a2e1SPrashanth Swaminathan 103*1fd5a2e1SPrashanth Swaminathan /* in case the function is going to return a structure 104*1fd5a2e1SPrashanth Swaminathan we need to give it a place to put the result. */ 105*1fd5a2e1SPrashanth Swaminathan ldw -52(%r3), %ret0 ; %ret0 <- rvalue 106*1fd5a2e1SPrashanth Swaminathan ldw -56(%r3), %r22 ; %r22 <- function to call 107*1fd5a2e1SPrashanth Swaminathan bl $$dyncall, %r31 ; Call the user function 108*1fd5a2e1SPrashanth Swaminathan copy %r31, %rp 109*1fd5a2e1SPrashanth Swaminathan 110*1fd5a2e1SPrashanth Swaminathan /* Prepare to store the result; we need to recover flags and rvalue. */ 111*1fd5a2e1SPrashanth Swaminathan ldw -48(%r3), %r21 ; r21 <- flags 112*1fd5a2e1SPrashanth Swaminathan ldw -52(%r3), %r20 ; r20 <- rvalue 113*1fd5a2e1SPrashanth Swaminathan 114*1fd5a2e1SPrashanth Swaminathan /* Store the result according to the return type. The most 115*1fd5a2e1SPrashanth Swaminathan likely types should come first. */ 116*1fd5a2e1SPrashanth Swaminathan 117*1fd5a2e1SPrashanth SwaminathanL$checkint 118*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_INT, %r21, L$checkint8 119*1fd5a2e1SPrashanth Swaminathan b L$done 120*1fd5a2e1SPrashanth Swaminathan stw %ret0, 0(%r20) 121*1fd5a2e1SPrashanth Swaminathan 122*1fd5a2e1SPrashanth SwaminathanL$checkint8 123*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_UINT8, %r21, L$checkint16 124*1fd5a2e1SPrashanth Swaminathan b L$done 125*1fd5a2e1SPrashanth Swaminathan stb %ret0, 0(%r20) 126*1fd5a2e1SPrashanth Swaminathan 127*1fd5a2e1SPrashanth SwaminathanL$checkint16 128*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_UINT16, %r21, L$checkdbl 129*1fd5a2e1SPrashanth Swaminathan b L$done 130*1fd5a2e1SPrashanth Swaminathan sth %ret0, 0(%r20) 131*1fd5a2e1SPrashanth Swaminathan 132*1fd5a2e1SPrashanth SwaminathanL$checkdbl 133*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_DOUBLE, %r21, L$checkfloat 134*1fd5a2e1SPrashanth Swaminathan b L$done 135*1fd5a2e1SPrashanth Swaminathan fstd %fr4,0(%r20) 136*1fd5a2e1SPrashanth Swaminathan 137*1fd5a2e1SPrashanth SwaminathanL$checkfloat 138*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_FLOAT, %r21, L$checkll 139*1fd5a2e1SPrashanth Swaminathan b L$done 140*1fd5a2e1SPrashanth Swaminathan fstw %fr4L,0(%r20) 141*1fd5a2e1SPrashanth Swaminathan 142*1fd5a2e1SPrashanth SwaminathanL$checkll 143*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_UINT64, %r21, L$checksmst2 144*1fd5a2e1SPrashanth Swaminathan stw %ret0, 0(%r20) 145*1fd5a2e1SPrashanth Swaminathan b L$done 146*1fd5a2e1SPrashanth Swaminathan stw %ret1, 4(%r20) 147*1fd5a2e1SPrashanth Swaminathan 148*1fd5a2e1SPrashanth SwaminathanL$checksmst2 149*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT2, %r21, L$checksmst3 150*1fd5a2e1SPrashanth Swaminathan /* 2-byte structs are returned in ret0 as ????xxyy. */ 151*1fd5a2e1SPrashanth Swaminathan extru %ret0, 23, 8, %r22 152*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 153*1fd5a2e1SPrashanth Swaminathan b L$done 154*1fd5a2e1SPrashanth Swaminathan stb %ret0, 0(%r20) 155*1fd5a2e1SPrashanth Swaminathan 156*1fd5a2e1SPrashanth SwaminathanL$checksmst3 157*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT3, %r21, L$checksmst4 158*1fd5a2e1SPrashanth Swaminathan /* 3-byte structs are returned in ret0 as ??xxyyzz. */ 159*1fd5a2e1SPrashanth Swaminathan extru %ret0, 15, 8, %r22 160*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 161*1fd5a2e1SPrashanth Swaminathan extru %ret0, 23, 8, %r22 162*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 163*1fd5a2e1SPrashanth Swaminathan b L$done 164*1fd5a2e1SPrashanth Swaminathan stb %ret0, 0(%r20) 165*1fd5a2e1SPrashanth Swaminathan 166*1fd5a2e1SPrashanth SwaminathanL$checksmst4 167*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT4, %r21, L$checksmst5 168*1fd5a2e1SPrashanth Swaminathan /* 4-byte structs are returned in ret0 as wwxxyyzz. */ 169*1fd5a2e1SPrashanth Swaminathan extru %ret0, 7, 8, %r22 170*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 171*1fd5a2e1SPrashanth Swaminathan extru %ret0, 15, 8, %r22 172*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 173*1fd5a2e1SPrashanth Swaminathan extru %ret0, 23, 8, %r22 174*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 175*1fd5a2e1SPrashanth Swaminathan b L$done 176*1fd5a2e1SPrashanth Swaminathan stb %ret0, 0(%r20) 177*1fd5a2e1SPrashanth Swaminathan 178*1fd5a2e1SPrashanth SwaminathanL$checksmst5 179*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT5, %r21, L$checksmst6 180*1fd5a2e1SPrashanth Swaminathan /* 5 byte values are returned right justified: 181*1fd5a2e1SPrashanth Swaminathan ret0 ret1 182*1fd5a2e1SPrashanth Swaminathan 5: ??????aa bbccddee */ 183*1fd5a2e1SPrashanth Swaminathan stbs,ma %ret0, 1(%r20) 184*1fd5a2e1SPrashanth Swaminathan extru %ret1, 7, 8, %r22 185*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 186*1fd5a2e1SPrashanth Swaminathan extru %ret1, 15, 8, %r22 187*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 188*1fd5a2e1SPrashanth Swaminathan extru %ret1, 23, 8, %r22 189*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 190*1fd5a2e1SPrashanth Swaminathan b L$done 191*1fd5a2e1SPrashanth Swaminathan stb %ret1, 0(%r20) 192*1fd5a2e1SPrashanth Swaminathan 193*1fd5a2e1SPrashanth SwaminathanL$checksmst6 194*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT6, %r21, L$checksmst7 195*1fd5a2e1SPrashanth Swaminathan /* 6 byte values are returned right justified: 196*1fd5a2e1SPrashanth Swaminathan ret0 ret1 197*1fd5a2e1SPrashanth Swaminathan 6: ????aabb ccddeeff */ 198*1fd5a2e1SPrashanth Swaminathan extru %ret0, 23, 8, %r22 199*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 200*1fd5a2e1SPrashanth Swaminathan stbs,ma %ret0, 1(%r20) 201*1fd5a2e1SPrashanth Swaminathan extru %ret1, 7, 8, %r22 202*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 203*1fd5a2e1SPrashanth Swaminathan extru %ret1, 15, 8, %r22 204*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 205*1fd5a2e1SPrashanth Swaminathan extru %ret1, 23, 8, %r22 206*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 207*1fd5a2e1SPrashanth Swaminathan b L$done 208*1fd5a2e1SPrashanth Swaminathan stb %ret1, 0(%r20) 209*1fd5a2e1SPrashanth Swaminathan 210*1fd5a2e1SPrashanth SwaminathanL$checksmst7 211*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT7, %r21, L$checksmst8 212*1fd5a2e1SPrashanth Swaminathan /* 7 byte values are returned right justified: 213*1fd5a2e1SPrashanth Swaminathan ret0 ret1 214*1fd5a2e1SPrashanth Swaminathan 7: ??aabbcc ddeeffgg */ 215*1fd5a2e1SPrashanth Swaminathan extru %ret0, 15, 8, %r22 216*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 217*1fd5a2e1SPrashanth Swaminathan extru %ret0, 23, 8, %r22 218*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 219*1fd5a2e1SPrashanth Swaminathan stbs,ma %ret0, 1(%r20) 220*1fd5a2e1SPrashanth Swaminathan extru %ret1, 7, 8, %r22 221*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 222*1fd5a2e1SPrashanth Swaminathan extru %ret1, 15, 8, %r22 223*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 224*1fd5a2e1SPrashanth Swaminathan extru %ret1, 23, 8, %r22 225*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 226*1fd5a2e1SPrashanth Swaminathan b L$done 227*1fd5a2e1SPrashanth Swaminathan stb %ret1, 0(%r20) 228*1fd5a2e1SPrashanth Swaminathan 229*1fd5a2e1SPrashanth SwaminathanL$checksmst8 230*1fd5a2e1SPrashanth Swaminathan comib,<>,n FFI_TYPE_SMALL_STRUCT8, %r21, L$done 231*1fd5a2e1SPrashanth Swaminathan /* 8 byte values are returned right justified: 232*1fd5a2e1SPrashanth Swaminathan ret0 ret1 233*1fd5a2e1SPrashanth Swaminathan 8: aabbccdd eeffgghh */ 234*1fd5a2e1SPrashanth Swaminathan extru %ret0, 7, 8, %r22 235*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 236*1fd5a2e1SPrashanth Swaminathan extru %ret0, 15, 8, %r22 237*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 238*1fd5a2e1SPrashanth Swaminathan extru %ret0, 23, 8, %r22 239*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 240*1fd5a2e1SPrashanth Swaminathan stbs,ma %ret0, 1(%r20) 241*1fd5a2e1SPrashanth Swaminathan extru %ret1, 7, 8, %r22 242*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 243*1fd5a2e1SPrashanth Swaminathan extru %ret1, 15, 8, %r22 244*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 245*1fd5a2e1SPrashanth Swaminathan extru %ret1, 23, 8, %r22 246*1fd5a2e1SPrashanth Swaminathan stbs,ma %r22, 1(%r20) 247*1fd5a2e1SPrashanth Swaminathan stb %ret1, 0(%r20) 248*1fd5a2e1SPrashanth Swaminathan 249*1fd5a2e1SPrashanth SwaminathanL$done 250*1fd5a2e1SPrashanth Swaminathan /* all done, return */ 251*1fd5a2e1SPrashanth Swaminathan copy %r4, %sp ; pop arg stack 252*1fd5a2e1SPrashanth Swaminathan ldw 12(%r3), %r4 253*1fd5a2e1SPrashanth Swaminathan ldwm -64(%sp), %r3 ; .. and pop stack 254*1fd5a2e1SPrashanth Swaminathan ldw -20(%sp), %rp 255*1fd5a2e1SPrashanth Swaminathan bv %r0(%rp) 256*1fd5a2e1SPrashanth Swaminathan nop 257*1fd5a2e1SPrashanth Swaminathan .exit 258*1fd5a2e1SPrashanth Swaminathan .procend 259*1fd5a2e1SPrashanth SwaminathanL$FE1 260*1fd5a2e1SPrashanth Swaminathan 261*1fd5a2e1SPrashanth Swaminathan /* void ffi_closure_pa32(void); 262*1fd5a2e1SPrashanth Swaminathan Called with closure argument in %r21 */ 263*1fd5a2e1SPrashanth Swaminathan 264*1fd5a2e1SPrashanth Swaminathan .SPACE $TEXT$ 265*1fd5a2e1SPrashanth Swaminathan .SUBSPA $CODE$ 266*1fd5a2e1SPrashanth Swaminathan .export ffi_closure_pa32,ENTRY,PRIV_LEV=3,RTNVAL=GR 267*1fd5a2e1SPrashanth Swaminathan .import ffi_closure_inner_pa32,CODE 268*1fd5a2e1SPrashanth Swaminathan .align 4 269*1fd5a2e1SPrashanth SwaminathanL$FB2 270*1fd5a2e1SPrashanth Swaminathanffi_closure_pa32 271*1fd5a2e1SPrashanth Swaminathan .proc 272*1fd5a2e1SPrashanth Swaminathan .callinfo FRAME=64,CALLS,SAVE_RP,SAVE_SP,ENTRY_GR=3 273*1fd5a2e1SPrashanth Swaminathan .entry 274*1fd5a2e1SPrashanth Swaminathan 275*1fd5a2e1SPrashanth Swaminathan stw %rp, -20(%sp) 276*1fd5a2e1SPrashanth Swaminathan copy %r3, %r1 277*1fd5a2e1SPrashanth SwaminathanL$CFI21 278*1fd5a2e1SPrashanth Swaminathan copy %sp, %r3 279*1fd5a2e1SPrashanth SwaminathanL$CFI22 280*1fd5a2e1SPrashanth Swaminathan stwm %r1, 64(%sp) 281*1fd5a2e1SPrashanth Swaminathan 282*1fd5a2e1SPrashanth Swaminathan /* Put arguments onto the stack and call ffi_closure_inner. */ 283*1fd5a2e1SPrashanth Swaminathan stw %arg0, -36(%r3) 284*1fd5a2e1SPrashanth Swaminathan stw %arg1, -40(%r3) 285*1fd5a2e1SPrashanth Swaminathan stw %arg2, -44(%r3) 286*1fd5a2e1SPrashanth Swaminathan stw %arg3, -48(%r3) 287*1fd5a2e1SPrashanth Swaminathan 288*1fd5a2e1SPrashanth Swaminathan copy %r21, %arg0 289*1fd5a2e1SPrashanth Swaminathan bl ffi_closure_inner_pa32, %r2 290*1fd5a2e1SPrashanth Swaminathan copy %r3, %arg1 291*1fd5a2e1SPrashanth Swaminathan ldwm -64(%sp), %r3 292*1fd5a2e1SPrashanth Swaminathan ldw -20(%sp), %rp 293*1fd5a2e1SPrashanth Swaminathan ldw -36(%sp), %ret0 294*1fd5a2e1SPrashanth Swaminathan bv %r0(%rp) 295*1fd5a2e1SPrashanth Swaminathan ldw -40(%sp), %ret1 296*1fd5a2e1SPrashanth Swaminathan .exit 297*1fd5a2e1SPrashanth Swaminathan .procend 298*1fd5a2e1SPrashanth SwaminathanL$FE2: 299*1fd5a2e1SPrashanth Swaminathan 300*1fd5a2e1SPrashanth Swaminathan .SPACE $PRIVATE$ 301*1fd5a2e1SPrashanth Swaminathan .SUBSPA $DATA$ 302*1fd5a2e1SPrashanth Swaminathan 303*1fd5a2e1SPrashanth Swaminathan .align 4 304*1fd5a2e1SPrashanth Swaminathan .EXPORT _GLOBAL__F_ffi_call_pa32,DATA 305*1fd5a2e1SPrashanth Swaminathan_GLOBAL__F_ffi_call_pa32 306*1fd5a2e1SPrashanth SwaminathanL$frame1: 307*1fd5a2e1SPrashanth Swaminathan .word L$ECIE1-L$SCIE1 ;# Length of Common Information Entry 308*1fd5a2e1SPrashanth SwaminathanL$SCIE1: 309*1fd5a2e1SPrashanth Swaminathan .word 0x0 ;# CIE Identifier Tag 310*1fd5a2e1SPrashanth Swaminathan .byte 0x1 ;# CIE Version 311*1fd5a2e1SPrashanth Swaminathan .ascii "\0" ;# CIE Augmentation 312*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1 ;# CIE Code Alignment Factor 313*1fd5a2e1SPrashanth Swaminathan .sleb128 4 ;# CIE Data Alignment Factor 314*1fd5a2e1SPrashanth Swaminathan .byte 0x2 ;# CIE RA Column 315*1fd5a2e1SPrashanth Swaminathan .byte 0xc ;# DW_CFA_def_cfa 316*1fd5a2e1SPrashanth Swaminathan .uleb128 0x1e 317*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 318*1fd5a2e1SPrashanth Swaminathan .align 4 319*1fd5a2e1SPrashanth SwaminathanL$ECIE1: 320*1fd5a2e1SPrashanth SwaminathanL$SFDE1: 321*1fd5a2e1SPrashanth Swaminathan .word L$EFDE1-L$ASFDE1 ;# FDE Length 322*1fd5a2e1SPrashanth SwaminathanL$ASFDE1: 323*1fd5a2e1SPrashanth Swaminathan .word L$ASFDE1-L$frame1 ;# FDE CIE offset 324*1fd5a2e1SPrashanth Swaminathan .word L$FB1 ;# FDE initial location 325*1fd5a2e1SPrashanth Swaminathan .word L$FE1-L$FB1 ;# FDE address range 326*1fd5a2e1SPrashanth Swaminathan 327*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ;# DW_CFA_advance_loc4 328*1fd5a2e1SPrashanth Swaminathan .word L$CFI11-L$FB1 329*1fd5a2e1SPrashanth Swaminathan .byte 0x83 ;# DW_CFA_offset, column 0x3 330*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 331*1fd5a2e1SPrashanth Swaminathan .byte 0x11 ;# DW_CFA_offset_extended_sf; save r2 at [r30-20] 332*1fd5a2e1SPrashanth Swaminathan .uleb128 0x2 333*1fd5a2e1SPrashanth Swaminathan .sleb128 -5 334*1fd5a2e1SPrashanth Swaminathan 335*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ;# DW_CFA_advance_loc4 336*1fd5a2e1SPrashanth Swaminathan .word L$CFI12-L$CFI11 337*1fd5a2e1SPrashanth Swaminathan .byte 0xd ;# DW_CFA_def_cfa_register = r3 338*1fd5a2e1SPrashanth Swaminathan .uleb128 0x3 339*1fd5a2e1SPrashanth Swaminathan 340*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ;# DW_CFA_advance_loc4 341*1fd5a2e1SPrashanth Swaminathan .word L$CFI13-L$CFI12 342*1fd5a2e1SPrashanth Swaminathan .byte 0x84 ;# DW_CFA_offset, column 0x4 343*1fd5a2e1SPrashanth Swaminathan .uleb128 0x3 344*1fd5a2e1SPrashanth Swaminathan 345*1fd5a2e1SPrashanth Swaminathan .align 4 346*1fd5a2e1SPrashanth SwaminathanL$EFDE1: 347*1fd5a2e1SPrashanth Swaminathan 348*1fd5a2e1SPrashanth SwaminathanL$SFDE2: 349*1fd5a2e1SPrashanth Swaminathan .word L$EFDE2-L$ASFDE2 ;# FDE Length 350*1fd5a2e1SPrashanth SwaminathanL$ASFDE2: 351*1fd5a2e1SPrashanth Swaminathan .word L$ASFDE2-L$frame1 ;# FDE CIE offset 352*1fd5a2e1SPrashanth Swaminathan .word L$FB2 ;# FDE initial location 353*1fd5a2e1SPrashanth Swaminathan .word L$FE2-L$FB2 ;# FDE address range 354*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ;# DW_CFA_advance_loc4 355*1fd5a2e1SPrashanth Swaminathan .word L$CFI21-L$FB2 356*1fd5a2e1SPrashanth Swaminathan .byte 0x83 ;# DW_CFA_offset, column 0x3 357*1fd5a2e1SPrashanth Swaminathan .uleb128 0x0 358*1fd5a2e1SPrashanth Swaminathan .byte 0x11 ;# DW_CFA_offset_extended_sf 359*1fd5a2e1SPrashanth Swaminathan .uleb128 0x2 360*1fd5a2e1SPrashanth Swaminathan .sleb128 -5 361*1fd5a2e1SPrashanth Swaminathan 362*1fd5a2e1SPrashanth Swaminathan .byte 0x4 ;# DW_CFA_advance_loc4 363*1fd5a2e1SPrashanth Swaminathan .word L$CFI22-L$CFI21 364*1fd5a2e1SPrashanth Swaminathan .byte 0xd ;# DW_CFA_def_cfa_register = r3 365*1fd5a2e1SPrashanth Swaminathan .uleb128 0x3 366*1fd5a2e1SPrashanth Swaminathan 367*1fd5a2e1SPrashanth Swaminathan .align 4 368*1fd5a2e1SPrashanth SwaminathanL$EFDE2: 369