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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     1   .LEVEL  1.1
     2 framesz .EQU 128
     4 ; XPTC_InvokeByIndex(nsISuppots* that, uint32_t methodIndex,
     5 ;   uint32_t paramCount, nsXPTCVariant* params);
     7 ; g++ need to compile everything with -fvtable-thunks !
     9   .SPACE  $TEXT$,SORT=8
    10   .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24
    11 XPTC_InvokeByIndex
    12   .PROC
    13   .CALLINFO CALLER,FRAME=72,ENTRY_GR=%r3,SAVE_RP,SAVE_SP,ARGS_SAVED,ALLOCA_FRAME
    15  ; frame marker takes 48 bytes,
    16  ; register spill area takes 8 bytes,
    17  ; local stack area takes 72 bytes result in 128 bytes total
    19   .ENTRY
    20         STW          %rp,-20(%sp)
    21         STW,MA       %r3,128(%sp)
    23         LDO     -framesz(%r30),%r28
    24         STW     %r28,-4(%r30)       ; save previous sp
    25         STW     %r19,-32(%r30)
    27         STW     %r26,-36-framesz(%r30)  ; save argument registers in
    28         STW     %r25,-40-framesz(%r30)  ; in PREVIOUS frame
    29         STW     %r24,-44-framesz(%r30)  ;
    30         STW     %r23,-48-framesz(%r30)  ;
    32         B,L     .+8,%r2
    33         ADDIL   L'invoke_count_bytes-$PIC_pcrel$1+4,%r2,%r1
    34         LDO     R'invoke_count_bytes-$PIC_pcrel$2+8(%r1),%r1
    35 $PIC_pcrel$1
    36         LDSID   (%r1),%r31
    37 $PIC_pcrel$2
    38         MTSP    %r31,%sr0
    39         .CALL   ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26;out=28
    40         BE,L    0(%sr0,%r1),%r31
    41         COPY    %r31,%r2
    43         CMPIB,>=        0,%r28, .+76
    44         COPY    %r30,%r3            ; copy stack ptr to saved stack ptr
    45         ADD     %r30,%r28,%r30      ; extend stack frame
    46         LDW     -4(%r3),%r28        ; move frame
    47         STW     %r28,-4(%r30)
    48         LDW     -8(%r3),%r28
    49         STW     %r28,-8(%r30)
    50         LDW     -12(%r3),%r28
    51         STW     %r28,-12(%r30)
    52         LDW     -16(%r3),%r28
    53         STW     %r28,-16(%r30)
    54         LDW     -20(%r3),%r28
    55         STW     %r28,-20(%r30)
    56         LDW     -24(%r3),%r28
    57         STW     %r28,-24(%r30)
    58         LDW     -28(%r3),%r28
    59         STW     %r28,-28(%r30)
    60         LDW     -32(%r3),%r28
    61         STW     %r28,-32(%r30)
    63         LDO     -40(%r30),%r26         ; load copy address
    64         LDW     -44-framesz(%r3),%r25  ; load rest of 2 arguments
    65         LDW     -48-framesz(%r3),%r24  ;
    67         LDW     -32(%r30),%r19 ; shared lib call destroys r19; reload
    68         B,L     .+8,%r2
    69         ADDIL   L'invoke_copy_to_stack-$PIC_pcrel$3+4,%r2,%r1
    70         LDO     R'invoke_copy_to_stack-$PIC_pcrel$4+8(%r1),%r1
    71 $PIC_pcrel$3
    72         LDSID   (%r1),%r31
    73 $PIC_pcrel$4
    74         MTSP    %r31,%sr0
    75         .CALL   ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26
    76         BE,L    0(%sr0,%r1),%r31
    77         COPY    %r31,%r2
    79         LDO     -48(%r30),%r20
    80         EXTRW,U,= %r28,31,1,%r22
    81         FLDD    0(%r20),%fr7  ; load double arg 1
    82         EXTRW,U,= %r28,30,1,%r22
    83         FLDW    8(%r20),%fr5L ; load float arg 1
    84         EXTRW,U,= %r28,29,1,%r22
    85         FLDW    4(%r20),%fr6L ; load float arg 2
    86         EXTRW,U,= %r28,28,1,%r22
    87         FLDW    0(%r20),%fr7L ; load float arg 3
    89         LDW     -36-framesz(%r3),%r26  ; load ptr to 'that'
    90         LDW     -40(%r30),%r25  ; load the rest of dispatch argument registers
    91         LDW     -44(%r30),%r24
    92         LDW     -48(%r30),%r23
    94         LDW     -36-framesz(%r3),%r20  ; load vtable addr
    95         LDW     -40-framesz(%r3),%r28  ; load index
    96         LDW     0(%r20),%r20    ; follow vtable
    97         LDO     16(%r20),%r20   ; offset vtable by 16 bytes (g++: 8, aCC: 16)
    98         SH2ADDL %r28,%r20,%r28  ; add 4*index to vtable entry
    99         LDW     0(%r28),%r22    ; load vtable entry
   101         B,L     .+8,%r2
   102         ADDIL   L'$$dyncall_external-$PIC_pcrel$5+4,%r2,%r1
   103         LDO     R'$$dyncall_external-$PIC_pcrel$6+8(%r1),%r1
   104 $PIC_pcrel$5
   105         LDSID   (%r1),%r31
   106 $PIC_pcrel$6
   107         MTSP    %r31,%sr0
   108         .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR
   109 ;in=22-26;out=28;
   110         BE,L    0(%sr0,%r1),%r31
   111         COPY    %r31,%r2
   113         LDW     -32(%r30),%r19
   114         COPY    %r3,%r30              ; restore saved stack ptr
   116         LDW          -148(%sp),%rp
   117         BVE             (%rp)
   118   .EXIT
   119         LDW,MB       -128(%sp),%r3
   121   .PROCEND  ;in=23,24,25,26;
   123   .ALIGN  8
   124   .SPACE  $TEXT$
   125   .SUBSPA $CODE$
   126   .IMPORT $$dyncall_external,MILLICODE
   127   .IMPORT invoke_count_bytes,CODE
   128   .IMPORT invoke_copy_to_stack,CODE
   129   .EXPORT XPTC_InvokeByIndex,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR,LONG_RETURN
   130   .END

mercurial