1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_parisc_linux.s Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,108 @@ 1.4 +/* -*- Mode: asm; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- 1.5 + * Version: MPL 1.1 1.6 + * 1.7 + * This Source Code Form is subject to the terms of the Mozilla Public 1.8 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.9 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.10 + 1.11 + .LEVEL 1.1 1.12 + .text 1.13 + .align 4 1.14 + 1.15 +framesz: 1.16 + .equ 128 1.17 + 1.18 +.globl NS_InvokeByIndex 1.19 + .type NS_InvokeByIndex, @function 1.20 + 1.21 + 1.22 +NS_InvokeByIndex: 1.23 + .PROC 1.24 + .CALLINFO FRAME=72, CALLER,SAVE_RP, SAVE_SP, ENTRY_GR=3 1.25 + .ENTRY 1.26 + 1.27 +; frame marker takes 48 bytes, 1.28 +; register spill area takes 8 bytes, 1.29 +; local stack area takes 72 bytes result in 128 bytes total 1.30 + 1.31 + STW %rp,-20(%sp) 1.32 + STW,MA %r3,128(%sp) 1.33 + 1.34 + LDO -framesz(%r30),%r28 1.35 + STW %r28,-4(%r30) ; save previous sp 1.36 + STW %r19,-32(%r30) 1.37 + 1.38 + STW %r26,-36-framesz(%r30) ; save argument registers in 1.39 + STW %r25,-40-framesz(%r30) ; in PREVIOUS frame 1.40 + STW %r24,-44-framesz(%r30) ; 1.41 + STW %r23,-48-framesz(%r30) ; 1.42 + 1.43 + .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26;out=28 1.44 + BL invoke_count_bytes,%r31 1.45 + COPY %r31,%r2 1.46 + 1.47 + CMPIB,>= 0,%r28, .+76 1.48 + COPY %r30,%r3 ; copy stack ptr to saved stack ptr 1.49 + ADD %r30,%r28,%r30 ; extend stack frame 1.50 + LDW -4(%r3),%r28 ; move frame 1.51 + STW %r28,-4(%r30) 1.52 + LDW -8(%r3),%r28 1.53 + STW %r28,-8(%r30) 1.54 + LDW -12(%r3),%r28 1.55 + STW %r28,-12(%r30) 1.56 + LDW -16(%r3),%r28 1.57 + STW %r28,-16(%r30) 1.58 + LDW -20(%r3),%r28 1.59 + STW %r28,-20(%r30) 1.60 + LDW -24(%r3),%r28 1.61 + STW %r28,-24(%r30) 1.62 + LDW -28(%r3),%r28 1.63 + STW %r28,-28(%r30) 1.64 + LDW -32(%r3),%r28 1.65 + STW %r28,-32(%r30) 1.66 + 1.67 + LDO -40(%r30),%r26 ; load copy address 1.68 + LDW -44-framesz(%r3),%r25 ; load rest of 2 arguments 1.69 + LDW -48-framesz(%r3),%r24 ; 1.70 + 1.71 + LDW -32(%r30),%r19 ; shared lib call destroys r19; reload 1.72 + .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26 1.73 + BL invoke_copy_to_stack,%r31 1.74 + COPY %r31,%r2 1.75 + 1.76 + LDO -48(%r30),%r20 1.77 + EXTRW,U,= %r28,31,1,%r22 1.78 + FLDD 0(%r20),%fr7 ; load double arg 1 1.79 + EXTRW,U,= %r28,30,1,%r22 1.80 + FLDW 8(%r20),%fr5L ; load float arg 1 1.81 + EXTRW,U,= %r28,29,1,%r22 1.82 + FLDW 4(%r20),%fr6L ; load float arg 2 1.83 + EXTRW,U,= %r28,28,1,%r22 1.84 + FLDW 0(%r20),%fr7L ; load float arg 3 1.85 + 1.86 + LDW -36-framesz(%r3),%r26 ; load ptr to 'that' 1.87 + LDW -40(%r30),%r25 ; load the rest of dispatch argument registers 1.88 + LDW -44(%r30),%r24 1.89 + LDW -48(%r30),%r23 1.90 + 1.91 + LDW -36-framesz(%r3),%r20 ; load vtable addr 1.92 + LDW -40-framesz(%r3),%r28 ; load index 1.93 + LDW 0(%r20),%r20 ; follow vtable 1.94 + SH2ADDL %r28,%r20,%r28 ; add 4*index to vtable entry 1.95 + LDW 0(%r28),%r22 ; load vtable entry 1.96 + 1.97 + .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR ;in=22-26;out=28; 1.98 + BL $$dyncall,%r31 1.99 + COPY %r31,%r2 1.100 + 1.101 + LDW -32(%r30),%r19 1.102 + COPY %r3,%r30 ; restore saved stack ptr 1.103 + 1.104 + LDW -148(%sp),%rp 1.105 + LDWM -128(%sp),%r3 1.106 + BV,N (%rp) 1.107 + NOP 1.108 + .EXIT 1.109 + .PROCEND ;in=23,24,25,26; 1.110 + .SIZE NS_InvokeByIndex, .-NS_InvokeByIndex 1.111 +