1*1fd5a2e1SPrashanth Swaminathan/* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan sysv.S - Copyright (c) 2000 Software AG 3*1fd5a2e1SPrashanth Swaminathan Copyright (c) 2008 Red Hat, Inc. 4*1fd5a2e1SPrashanth Swaminathan 5*1fd5a2e1SPrashanth Swaminathan S390 Foreign Function Interface 6*1fd5a2e1SPrashanth Swaminathan 7*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 8*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 9*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 10*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 11*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 12*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 13*1fd5a2e1SPrashanth Swaminathan the following conditions: 14*1fd5a2e1SPrashanth Swaminathan 15*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 16*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 17*1fd5a2e1SPrashanth Swaminathan 18*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 19*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 22*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 23*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 24*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 25*1fd5a2e1SPrashanth Swaminathan 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 .text 33*1fd5a2e1SPrashanth Swaminathan 34*1fd5a2e1SPrashanth Swaminathan#ifndef __s390x__ 35*1fd5a2e1SPrashanth Swaminathan 36*1fd5a2e1SPrashanth Swaminathan # r2: frame 37*1fd5a2e1SPrashanth Swaminathan # r3: ret_type 38*1fd5a2e1SPrashanth Swaminathan # r4: ret_addr 39*1fd5a2e1SPrashanth Swaminathan # r5: fun 40*1fd5a2e1SPrashanth Swaminathan # r6: closure 41*1fd5a2e1SPrashanth Swaminathan 42*1fd5a2e1SPrashanth Swaminathan # This assumes we are using gas. 43*1fd5a2e1SPrashanth Swaminathan .balign 8 44*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_SYSV 45*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(ffi_call_SYSV) 46*1fd5a2e1SPrashanth Swaminathan .type ffi_call_SYSV,%function 47*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV: 48*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 49*1fd5a2e1SPrashanth Swaminathan st %r6,44(%r2) # Save registers 50*1fd5a2e1SPrashanth Swaminathan stm %r12,%r14,48(%r2) 51*1fd5a2e1SPrashanth Swaminathan lr %r13,%r2 # Install frame pointer 52*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r6, 44 53*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r12, 48 54*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r13, 52 55*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r14, 56 56*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_register r13 57*1fd5a2e1SPrashanth Swaminathan st %r2,0(%r15) # Set up back chain 58*1fd5a2e1SPrashanth Swaminathan sla %r3,3 # ret_type *= 8 59*1fd5a2e1SPrashanth Swaminathan lr %r12,%r4 # Save ret_addr 60*1fd5a2e1SPrashanth Swaminathan lr %r1,%r5 # Save fun 61*1fd5a2e1SPrashanth Swaminathan lr %r0,%r6 # Install static chain 62*1fd5a2e1SPrashanth Swaminathan 63*1fd5a2e1SPrashanth Swaminathan # Set return address, so that there is only one indirect jump. 64*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_S390_ZARCH 65*1fd5a2e1SPrashanth Swaminathan larl %r14,.Ltable 66*1fd5a2e1SPrashanth Swaminathan ar %r14,%r3 67*1fd5a2e1SPrashanth Swaminathan#else 68*1fd5a2e1SPrashanth Swaminathan basr %r14,0 69*1fd5a2e1SPrashanth Swaminathan0: la %r14,.Ltable-0b(%r14,%r3) 70*1fd5a2e1SPrashanth Swaminathan#endif 71*1fd5a2e1SPrashanth Swaminathan 72*1fd5a2e1SPrashanth Swaminathan lm %r2,%r6,8(%r13) # Load arguments 73*1fd5a2e1SPrashanth Swaminathan ld %f0,64(%r13) 74*1fd5a2e1SPrashanth Swaminathan ld %f2,72(%r13) 75*1fd5a2e1SPrashanth Swaminathan br %r1 # ... and call function 76*1fd5a2e1SPrashanth Swaminathan 77*1fd5a2e1SPrashanth Swaminathan .balign 8 78*1fd5a2e1SPrashanth Swaminathan.Ltable: 79*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_DOUBLE 80*1fd5a2e1SPrashanth Swaminathan std %f0,0(%r12) 81*1fd5a2e1SPrashanth Swaminathan j .Ldone 82*1fd5a2e1SPrashanth Swaminathan 83*1fd5a2e1SPrashanth Swaminathan .balign 8 84*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_FLOAT 85*1fd5a2e1SPrashanth Swaminathan ste %f0,0(%r12) 86*1fd5a2e1SPrashanth Swaminathan j .Ldone 87*1fd5a2e1SPrashanth Swaminathan 88*1fd5a2e1SPrashanth Swaminathan .balign 8 89*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT64 90*1fd5a2e1SPrashanth Swaminathan st %r3,4(%r12) 91*1fd5a2e1SPrashanth Swaminathan nop 92*1fd5a2e1SPrashanth Swaminathan # fallthru 93*1fd5a2e1SPrashanth Swaminathan 94*1fd5a2e1SPrashanth Swaminathan .balign 8 95*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT32 96*1fd5a2e1SPrashanth Swaminathan st %r2,0(%r12) 97*1fd5a2e1SPrashanth Swaminathan nop 98*1fd5a2e1SPrashanth Swaminathan # fallthru 99*1fd5a2e1SPrashanth Swaminathan 100*1fd5a2e1SPrashanth Swaminathan .balign 8 101*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_VOID 102*1fd5a2e1SPrashanth Swaminathan.Ldone: 103*1fd5a2e1SPrashanth Swaminathan l %r14,56(%r13) 104*1fd5a2e1SPrashanth Swaminathan l %r12,48(%r13) 105*1fd5a2e1SPrashanth Swaminathan l %r6,44(%r13) 106*1fd5a2e1SPrashanth Swaminathan l %r13,52(%r13) 107*1fd5a2e1SPrashanth Swaminathan .cfi_restore 14 108*1fd5a2e1SPrashanth Swaminathan .cfi_restore 13 109*1fd5a2e1SPrashanth Swaminathan .cfi_restore 12 110*1fd5a2e1SPrashanth Swaminathan .cfi_restore 6 111*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa r15, 96 112*1fd5a2e1SPrashanth Swaminathan br %r14 113*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 114*1fd5a2e1SPrashanth Swaminathan .size ffi_call_SYSV,.-ffi_call_SYSV 115*1fd5a2e1SPrashanth Swaminathan 116*1fd5a2e1SPrashanth Swaminathan 117*1fd5a2e1SPrashanth Swaminathan .balign 8 118*1fd5a2e1SPrashanth Swaminathan .globl ffi_go_closure_SYSV 119*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(ffi_go_closure_SYSV) 120*1fd5a2e1SPrashanth Swaminathan .type ffi_go_closure_SYSV,%function 121*1fd5a2e1SPrashanth Swaminathanffi_go_closure_SYSV: 122*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 123*1fd5a2e1SPrashanth Swaminathan stm %r2,%r6,8(%r15) # Save arguments 124*1fd5a2e1SPrashanth Swaminathan lr %r4,%r0 # Load closure -> user_data 125*1fd5a2e1SPrashanth Swaminathan l %r2,4(%r4) # ->cif 126*1fd5a2e1SPrashanth Swaminathan l %r3,8(%r4) # ->fun 127*1fd5a2e1SPrashanth Swaminathan j .Ldoclosure 128*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 129*1fd5a2e1SPrashanth Swaminathan 130*1fd5a2e1SPrashanth Swaminathan .balign 8 131*1fd5a2e1SPrashanth Swaminathan .globl ffi_closure_SYSV 132*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(ffi_closure_SYSV) 133*1fd5a2e1SPrashanth Swaminathan .type ffi_closure_SYSV,%function 134*1fd5a2e1SPrashanth Swaminathanffi_closure_SYSV: 135*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 136*1fd5a2e1SPrashanth Swaminathan stm %r2,%r6,8(%r15) # Save arguments 137*1fd5a2e1SPrashanth Swaminathan lr %r4,%r0 # Closure 138*1fd5a2e1SPrashanth Swaminathan l %r2,16(%r4) # ->cif 139*1fd5a2e1SPrashanth Swaminathan l %r3,20(%r4) # ->fun 140*1fd5a2e1SPrashanth Swaminathan l %r4,24(%r4) # ->user_data 141*1fd5a2e1SPrashanth Swaminathan.Ldoclosure: 142*1fd5a2e1SPrashanth Swaminathan stm %r12,%r15,48(%r15) # Save registers 143*1fd5a2e1SPrashanth Swaminathan lr %r12,%r15 144*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_register r12 145*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r6, 24 146*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r12, 48 147*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r13, 52 148*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r14, 56 149*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r15, 60 150*1fd5a2e1SPrashanth Swaminathan#ifndef HAVE_AS_S390_ZARCH 151*1fd5a2e1SPrashanth Swaminathan basr %r13,0 # Set up base register 152*1fd5a2e1SPrashanth Swaminathan.Lcbase: 153*1fd5a2e1SPrashanth Swaminathan l %r1,.Lchelper-.Lcbase(%r13) # Get helper function 154*1fd5a2e1SPrashanth Swaminathan#endif 155*1fd5a2e1SPrashanth Swaminathan ahi %r15,-96-8 # Set up stack frame 156*1fd5a2e1SPrashanth Swaminathan st %r12,0(%r15) # Set up back chain 157*1fd5a2e1SPrashanth Swaminathan 158*1fd5a2e1SPrashanth Swaminathan std %f0,64(%r12) # Save fp arguments 159*1fd5a2e1SPrashanth Swaminathan std %f2,72(%r12) 160*1fd5a2e1SPrashanth Swaminathan 161*1fd5a2e1SPrashanth Swaminathan la %r5,96(%r12) # Overflow 162*1fd5a2e1SPrashanth Swaminathan st %r5,96(%r15) 163*1fd5a2e1SPrashanth Swaminathan la %r6,64(%r12) # FPRs 164*1fd5a2e1SPrashanth Swaminathan la %r5,8(%r12) # GPRs 165*1fd5a2e1SPrashanth Swaminathan#ifdef HAVE_AS_S390_ZARCH 166*1fd5a2e1SPrashanth Swaminathan brasl %r14,ffi_closure_helper_SYSV 167*1fd5a2e1SPrashanth Swaminathan#else 168*1fd5a2e1SPrashanth Swaminathan bas %r14,0(%r1,%r13) # Call helper 169*1fd5a2e1SPrashanth Swaminathan#endif 170*1fd5a2e1SPrashanth Swaminathan 171*1fd5a2e1SPrashanth Swaminathan lr %r15,%r12 172*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_register r15 173*1fd5a2e1SPrashanth Swaminathan lm %r12,%r14,48(%r12) # Restore saved registers 174*1fd5a2e1SPrashanth Swaminathan l %r6,24(%r15) 175*1fd5a2e1SPrashanth Swaminathan ld %f0,64(%r15) # Load return registers 176*1fd5a2e1SPrashanth Swaminathan lm %r2,%r3,8(%r15) 177*1fd5a2e1SPrashanth Swaminathan br %r14 178*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 179*1fd5a2e1SPrashanth Swaminathan 180*1fd5a2e1SPrashanth Swaminathan#ifndef HAVE_AS_S390_ZARCH 181*1fd5a2e1SPrashanth Swaminathan .align 4 182*1fd5a2e1SPrashanth Swaminathan.Lchelper: 183*1fd5a2e1SPrashanth Swaminathan .long ffi_closure_helper_SYSV-.Lcbase 184*1fd5a2e1SPrashanth Swaminathan#endif 185*1fd5a2e1SPrashanth Swaminathan 186*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_SYSV,.-ffi_closure_SYSV 187*1fd5a2e1SPrashanth Swaminathan 188*1fd5a2e1SPrashanth Swaminathan#else 189*1fd5a2e1SPrashanth Swaminathan 190*1fd5a2e1SPrashanth Swaminathan # r2: frame 191*1fd5a2e1SPrashanth Swaminathan # r3: ret_type 192*1fd5a2e1SPrashanth Swaminathan # r4: ret_addr 193*1fd5a2e1SPrashanth Swaminathan # r5: fun 194*1fd5a2e1SPrashanth Swaminathan # r6: closure 195*1fd5a2e1SPrashanth Swaminathan 196*1fd5a2e1SPrashanth Swaminathan # This assumes we are using gas. 197*1fd5a2e1SPrashanth Swaminathan .balign 8 198*1fd5a2e1SPrashanth Swaminathan .globl ffi_call_SYSV 199*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(ffi_call_SYSV) 200*1fd5a2e1SPrashanth Swaminathan .type ffi_call_SYSV,%function 201*1fd5a2e1SPrashanth Swaminathanffi_call_SYSV: 202*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 203*1fd5a2e1SPrashanth Swaminathan stg %r6,88(%r2) # Save registers 204*1fd5a2e1SPrashanth Swaminathan stmg %r12,%r14,96(%r2) 205*1fd5a2e1SPrashanth Swaminathan lgr %r13,%r2 # Install frame pointer 206*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r6, 88 207*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r12, 96 208*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r13, 104 209*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r14, 112 210*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_register r13 211*1fd5a2e1SPrashanth Swaminathan stg %r2,0(%r15) # Set up back chain 212*1fd5a2e1SPrashanth Swaminathan larl %r14,.Ltable # Set up return address 213*1fd5a2e1SPrashanth Swaminathan slag %r3,%r3,3 # ret_type *= 8 214*1fd5a2e1SPrashanth Swaminathan lgr %r12,%r4 # Save ret_addr 215*1fd5a2e1SPrashanth Swaminathan lgr %r1,%r5 # Save fun 216*1fd5a2e1SPrashanth Swaminathan lgr %r0,%r6 # Install static chain 217*1fd5a2e1SPrashanth Swaminathan agr %r14,%r3 218*1fd5a2e1SPrashanth Swaminathan lmg %r2,%r6,16(%r13) # Load arguments 219*1fd5a2e1SPrashanth Swaminathan ld %f0,128(%r13) 220*1fd5a2e1SPrashanth Swaminathan ld %f2,136(%r13) 221*1fd5a2e1SPrashanth Swaminathan ld %f4,144(%r13) 222*1fd5a2e1SPrashanth Swaminathan ld %f6,152(%r13) 223*1fd5a2e1SPrashanth Swaminathan br %r1 # ... and call function 224*1fd5a2e1SPrashanth Swaminathan 225*1fd5a2e1SPrashanth Swaminathan .balign 8 226*1fd5a2e1SPrashanth Swaminathan.Ltable: 227*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_DOUBLE 228*1fd5a2e1SPrashanth Swaminathan std %f0,0(%r12) 229*1fd5a2e1SPrashanth Swaminathan j .Ldone 230*1fd5a2e1SPrashanth Swaminathan 231*1fd5a2e1SPrashanth Swaminathan .balign 8 232*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_DOUBLE 233*1fd5a2e1SPrashanth Swaminathan ste %f0,0(%r12) 234*1fd5a2e1SPrashanth Swaminathan j .Ldone 235*1fd5a2e1SPrashanth Swaminathan 236*1fd5a2e1SPrashanth Swaminathan .balign 8 237*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT64 238*1fd5a2e1SPrashanth Swaminathan stg %r2,0(%r12) 239*1fd5a2e1SPrashanth Swaminathan 240*1fd5a2e1SPrashanth Swaminathan .balign 8 241*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_INT32 242*1fd5a2e1SPrashanth Swaminathan # Never used, as we always store type ffi_arg. 243*1fd5a2e1SPrashanth Swaminathan # But the stg above is 6 bytes and we cannot 244*1fd5a2e1SPrashanth Swaminathan # jump around this case, so fall through. 245*1fd5a2e1SPrashanth Swaminathan nop 246*1fd5a2e1SPrashanth Swaminathan nop 247*1fd5a2e1SPrashanth Swaminathan 248*1fd5a2e1SPrashanth Swaminathan .balign 8 249*1fd5a2e1SPrashanth Swaminathan# FFI390_RET_VOID 250*1fd5a2e1SPrashanth Swaminathan.Ldone: 251*1fd5a2e1SPrashanth Swaminathan lg %r14,112(%r13) 252*1fd5a2e1SPrashanth Swaminathan lg %r12,96(%r13) 253*1fd5a2e1SPrashanth Swaminathan lg %r6,88(%r13) 254*1fd5a2e1SPrashanth Swaminathan lg %r13,104(%r13) 255*1fd5a2e1SPrashanth Swaminathan .cfi_restore r14 256*1fd5a2e1SPrashanth Swaminathan .cfi_restore r13 257*1fd5a2e1SPrashanth Swaminathan .cfi_restore r12 258*1fd5a2e1SPrashanth Swaminathan .cfi_restore r6 259*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa r15, 160 260*1fd5a2e1SPrashanth Swaminathan br %r14 261*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 262*1fd5a2e1SPrashanth Swaminathan .size ffi_call_SYSV,.-ffi_call_SYSV 263*1fd5a2e1SPrashanth Swaminathan 264*1fd5a2e1SPrashanth Swaminathan 265*1fd5a2e1SPrashanth Swaminathan .balign 8 266*1fd5a2e1SPrashanth Swaminathan .globl ffi_go_closure_SYSV 267*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(ffi_go_closure_SYSV) 268*1fd5a2e1SPrashanth Swaminathan .type ffi_go_closure_SYSV,%function 269*1fd5a2e1SPrashanth Swaminathanffi_go_closure_SYSV: 270*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 271*1fd5a2e1SPrashanth Swaminathan stmg %r2,%r6,16(%r15) # Save arguments 272*1fd5a2e1SPrashanth Swaminathan lgr %r4,%r0 # Load closure -> user_data 273*1fd5a2e1SPrashanth Swaminathan lg %r2,8(%r4) # ->cif 274*1fd5a2e1SPrashanth Swaminathan lg %r3,16(%r4) # ->fun 275*1fd5a2e1SPrashanth Swaminathan j .Ldoclosure 276*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 277*1fd5a2e1SPrashanth Swaminathan .size ffi_go_closure_SYSV,.-ffi_go_closure_SYSV 278*1fd5a2e1SPrashanth Swaminathan 279*1fd5a2e1SPrashanth Swaminathan 280*1fd5a2e1SPrashanth Swaminathan .balign 8 281*1fd5a2e1SPrashanth Swaminathan .globl ffi_closure_SYSV 282*1fd5a2e1SPrashanth Swaminathan FFI_HIDDEN(ffi_closure_SYSV) 283*1fd5a2e1SPrashanth Swaminathan .type ffi_closure_SYSV,%function 284*1fd5a2e1SPrashanth Swaminathanffi_closure_SYSV: 285*1fd5a2e1SPrashanth Swaminathan .cfi_startproc 286*1fd5a2e1SPrashanth Swaminathan stmg %r2,%r6,16(%r15) # Save arguments 287*1fd5a2e1SPrashanth Swaminathan lgr %r4,%r0 # Load closure 288*1fd5a2e1SPrashanth Swaminathan lg %r2,32(%r4) # ->cif 289*1fd5a2e1SPrashanth Swaminathan lg %r3,40(%r4) # ->fun 290*1fd5a2e1SPrashanth Swaminathan lg %r4,48(%r4) # ->user_data 291*1fd5a2e1SPrashanth Swaminathan.Ldoclosure: 292*1fd5a2e1SPrashanth Swaminathan stmg %r13,%r15,104(%r15) # Save registers 293*1fd5a2e1SPrashanth Swaminathan lgr %r13,%r15 294*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_register r13 295*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r6, 48 296*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r13, 104 297*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r14, 112 298*1fd5a2e1SPrashanth Swaminathan .cfi_rel_offset r15, 120 299*1fd5a2e1SPrashanth Swaminathan aghi %r15,-160-16 # Set up stack frame 300*1fd5a2e1SPrashanth Swaminathan stg %r13,0(%r15) # Set up back chain 301*1fd5a2e1SPrashanth Swaminathan 302*1fd5a2e1SPrashanth Swaminathan std %f0,128(%r13) # Save fp arguments 303*1fd5a2e1SPrashanth Swaminathan std %f2,136(%r13) 304*1fd5a2e1SPrashanth Swaminathan std %f4,144(%r13) 305*1fd5a2e1SPrashanth Swaminathan std %f6,152(%r13) 306*1fd5a2e1SPrashanth Swaminathan la %r5,160(%r13) # Overflow 307*1fd5a2e1SPrashanth Swaminathan stg %r5,160(%r15) 308*1fd5a2e1SPrashanth Swaminathan la %r6,128(%r13) # FPRs 309*1fd5a2e1SPrashanth Swaminathan la %r5,16(%r13) # GPRs 310*1fd5a2e1SPrashanth Swaminathan brasl %r14,ffi_closure_helper_SYSV # Call helper 311*1fd5a2e1SPrashanth Swaminathan 312*1fd5a2e1SPrashanth Swaminathan lgr %r15,%r13 313*1fd5a2e1SPrashanth Swaminathan .cfi_def_cfa_register r15 314*1fd5a2e1SPrashanth Swaminathan lmg %r13,%r14,104(%r13) # Restore saved registers 315*1fd5a2e1SPrashanth Swaminathan lg %r6,48(%r15) 316*1fd5a2e1SPrashanth Swaminathan ld %f0,128(%r15) # Load return registers 317*1fd5a2e1SPrashanth Swaminathan lg %r2,16(%r15) 318*1fd5a2e1SPrashanth Swaminathan br %r14 319*1fd5a2e1SPrashanth Swaminathan .cfi_endproc 320*1fd5a2e1SPrashanth Swaminathan .size ffi_closure_SYSV,.-ffi_closure_SYSV 321*1fd5a2e1SPrashanth Swaminathan#endif /* !s390x */ 322*1fd5a2e1SPrashanth Swaminathan 323*1fd5a2e1SPrashanth Swaminathan#if defined __ELF__ && defined __linux__ 324*1fd5a2e1SPrashanth Swaminathan .section .note.GNU-stack,"",@progbits 325*1fd5a2e1SPrashanth Swaminathan#endif 326