xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_pa32.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_pa32.s	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,131 @@
     1.4 +  .LEVEL  1.1
     1.5 +framesz .EQU 128
     1.6 +
     1.7 +; XPTC_InvokeByIndex(nsISuppots* that, uint32_t methodIndex,
     1.8 +;   uint32_t paramCount, nsXPTCVariant* params);
     1.9 +
    1.10 +; g++ need to compile everything with -fvtable-thunks !
    1.11 +
    1.12 +  .SPACE  $TEXT$,SORT=8
    1.13 +  .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24
    1.14 +XPTC_InvokeByIndex
    1.15 +  .PROC
    1.16 +  .CALLINFO CALLER,FRAME=72,ENTRY_GR=%r3,SAVE_RP,SAVE_SP,ARGS_SAVED,ALLOCA_FRAME
    1.17 +
    1.18 + ; frame marker takes 48 bytes,
    1.19 + ; register spill area takes 8 bytes,
    1.20 + ; local stack area takes 72 bytes result in 128 bytes total
    1.21 +
    1.22 +  .ENTRY
    1.23 +        STW          %rp,-20(%sp)
    1.24 +        STW,MA       %r3,128(%sp)
    1.25 +
    1.26 +        LDO     -framesz(%r30),%r28
    1.27 +        STW     %r28,-4(%r30)       ; save previous sp
    1.28 +        STW     %r19,-32(%r30)
    1.29 +
    1.30 +        STW     %r26,-36-framesz(%r30)  ; save argument registers in
    1.31 +        STW     %r25,-40-framesz(%r30)  ; in PREVIOUS frame
    1.32 +        STW     %r24,-44-framesz(%r30)  ;
    1.33 +        STW     %r23,-48-framesz(%r30)  ;
    1.34 +
    1.35 +        B,L     .+8,%r2
    1.36 +        ADDIL   L'invoke_count_bytes-$PIC_pcrel$1+4,%r2,%r1
    1.37 +        LDO     R'invoke_count_bytes-$PIC_pcrel$2+8(%r1),%r1
    1.38 +$PIC_pcrel$1
    1.39 +        LDSID   (%r1),%r31
    1.40 +$PIC_pcrel$2
    1.41 +        MTSP    %r31,%sr0
    1.42 +        .CALL   ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26;out=28
    1.43 +        BE,L    0(%sr0,%r1),%r31
    1.44 +        COPY    %r31,%r2
    1.45 +
    1.46 +        CMPIB,>=        0,%r28, .+76
    1.47 +        COPY    %r30,%r3            ; copy stack ptr to saved stack ptr
    1.48 +        ADD     %r30,%r28,%r30      ; extend stack frame
    1.49 +        LDW     -4(%r3),%r28        ; move frame
    1.50 +        STW     %r28,-4(%r30)
    1.51 +        LDW     -8(%r3),%r28
    1.52 +        STW     %r28,-8(%r30)
    1.53 +        LDW     -12(%r3),%r28
    1.54 +        STW     %r28,-12(%r30)
    1.55 +        LDW     -16(%r3),%r28
    1.56 +        STW     %r28,-16(%r30)
    1.57 +        LDW     -20(%r3),%r28
    1.58 +        STW     %r28,-20(%r30)
    1.59 +        LDW     -24(%r3),%r28
    1.60 +        STW     %r28,-24(%r30)
    1.61 +        LDW     -28(%r3),%r28
    1.62 +        STW     %r28,-28(%r30)
    1.63 +        LDW     -32(%r3),%r28
    1.64 +        STW     %r28,-32(%r30)
    1.65 +
    1.66 +        LDO     -40(%r30),%r26         ; load copy address
    1.67 +        LDW     -44-framesz(%r3),%r25  ; load rest of 2 arguments
    1.68 +        LDW     -48-framesz(%r3),%r24  ;
    1.69 +
    1.70 +        LDW     -32(%r30),%r19 ; shared lib call destroys r19; reload
    1.71 +        B,L     .+8,%r2
    1.72 +        ADDIL   L'invoke_copy_to_stack-$PIC_pcrel$3+4,%r2,%r1
    1.73 +        LDO     R'invoke_copy_to_stack-$PIC_pcrel$4+8(%r1),%r1
    1.74 +$PIC_pcrel$3
    1.75 +        LDSID   (%r1),%r31
    1.76 +$PIC_pcrel$4
    1.77 +        MTSP    %r31,%sr0
    1.78 +        .CALL   ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26
    1.79 +        BE,L    0(%sr0,%r1),%r31
    1.80 +        COPY    %r31,%r2
    1.81 +
    1.82 +        LDO     -48(%r30),%r20
    1.83 +        EXTRW,U,= %r28,31,1,%r22
    1.84 +        FLDD    0(%r20),%fr7  ; load double arg 1
    1.85 +        EXTRW,U,= %r28,30,1,%r22
    1.86 +        FLDW    8(%r20),%fr5L ; load float arg 1
    1.87 +        EXTRW,U,= %r28,29,1,%r22
    1.88 +        FLDW    4(%r20),%fr6L ; load float arg 2
    1.89 +        EXTRW,U,= %r28,28,1,%r22
    1.90 +        FLDW    0(%r20),%fr7L ; load float arg 3
    1.91 +
    1.92 +        LDW     -36-framesz(%r3),%r26  ; load ptr to 'that'
    1.93 +        LDW     -40(%r30),%r25  ; load the rest of dispatch argument registers
    1.94 +        LDW     -44(%r30),%r24
    1.95 +        LDW     -48(%r30),%r23
    1.96 +
    1.97 +        LDW     -36-framesz(%r3),%r20  ; load vtable addr
    1.98 +        LDW     -40-framesz(%r3),%r28  ; load index
    1.99 +        LDW     0(%r20),%r20    ; follow vtable
   1.100 +        LDO     16(%r20),%r20   ; offset vtable by 16 bytes (g++: 8, aCC: 16)
   1.101 +        SH2ADDL %r28,%r20,%r28  ; add 4*index to vtable entry
   1.102 +        LDW     0(%r28),%r22    ; load vtable entry
   1.103 +
   1.104 +        B,L     .+8,%r2
   1.105 +        ADDIL   L'$$dyncall_external-$PIC_pcrel$5+4,%r2,%r1
   1.106 +        LDO     R'$$dyncall_external-$PIC_pcrel$6+8(%r1),%r1
   1.107 +$PIC_pcrel$5
   1.108 +        LDSID   (%r1),%r31
   1.109 +$PIC_pcrel$6
   1.110 +        MTSP    %r31,%sr0
   1.111 +        .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR
   1.112 +;in=22-26;out=28;
   1.113 +        BE,L    0(%sr0,%r1),%r31
   1.114 +        COPY    %r31,%r2
   1.115 +
   1.116 +        LDW     -32(%r30),%r19
   1.117 +        COPY    %r3,%r30              ; restore saved stack ptr
   1.118 +
   1.119 +        LDW          -148(%sp),%rp
   1.120 +        BVE             (%rp)
   1.121 +  .EXIT
   1.122 +        LDW,MB       -128(%sp),%r3
   1.123 +
   1.124 +  .PROCEND  ;in=23,24,25,26;
   1.125 +
   1.126 +  .ALIGN  8
   1.127 +  .SPACE  $TEXT$
   1.128 +  .SUBSPA $CODE$
   1.129 +  .IMPORT $$dyncall_external,MILLICODE
   1.130 +  .IMPORT invoke_count_bytes,CODE
   1.131 +  .IMPORT invoke_copy_to_stack,CODE
   1.132 +  .EXPORT XPTC_InvokeByIndex,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR,LONG_RETURN
   1.133 +  .END
   1.134 +

mercurial