xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_parisc_linux.s

changeset 0
6474c204b198
     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 +

mercurial