michael@0: .LEVEL 1.1 michael@0: framesz .EQU 128 michael@0: michael@0: ; XPTC_InvokeByIndex(nsISuppots* that, uint32_t methodIndex, michael@0: ; uint32_t paramCount, nsXPTCVariant* params); michael@0: michael@0: ; g++ need to compile everything with -fvtable-thunks ! michael@0: michael@0: .SPACE $TEXT$,SORT=8 michael@0: .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=0x2c,CODE_ONLY,SORT=24 michael@0: XPTC_InvokeByIndex michael@0: .PROC michael@0: .CALLINFO CALLER,FRAME=72,ENTRY_GR=%r3,SAVE_RP,SAVE_SP,ARGS_SAVED,ALLOCA_FRAME michael@0: michael@0: ; frame marker takes 48 bytes, michael@0: ; register spill area takes 8 bytes, michael@0: ; local stack area takes 72 bytes result in 128 bytes total michael@0: michael@0: .ENTRY michael@0: STW %rp,-20(%sp) michael@0: STW,MA %r3,128(%sp) michael@0: michael@0: LDO -framesz(%r30),%r28 michael@0: STW %r28,-4(%r30) ; save previous sp michael@0: STW %r19,-32(%r30) michael@0: michael@0: STW %r26,-36-framesz(%r30) ; save argument registers in michael@0: STW %r25,-40-framesz(%r30) ; in PREVIOUS frame michael@0: STW %r24,-44-framesz(%r30) ; michael@0: STW %r23,-48-framesz(%r30) ; michael@0: michael@0: B,L .+8,%r2 michael@0: ADDIL L'invoke_count_bytes-$PIC_pcrel$1+4,%r2,%r1 michael@0: LDO R'invoke_count_bytes-$PIC_pcrel$2+8(%r1),%r1 michael@0: $PIC_pcrel$1 michael@0: LDSID (%r1),%r31 michael@0: $PIC_pcrel$2 michael@0: MTSP %r31,%sr0 michael@0: .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26;out=28 michael@0: BE,L 0(%sr0,%r1),%r31 michael@0: COPY %r31,%r2 michael@0: michael@0: CMPIB,>= 0,%r28, .+76 michael@0: COPY %r30,%r3 ; copy stack ptr to saved stack ptr michael@0: ADD %r30,%r28,%r30 ; extend stack frame michael@0: LDW -4(%r3),%r28 ; move frame michael@0: STW %r28,-4(%r30) michael@0: LDW -8(%r3),%r28 michael@0: STW %r28,-8(%r30) michael@0: LDW -12(%r3),%r28 michael@0: STW %r28,-12(%r30) michael@0: LDW -16(%r3),%r28 michael@0: STW %r28,-16(%r30) michael@0: LDW -20(%r3),%r28 michael@0: STW %r28,-20(%r30) michael@0: LDW -24(%r3),%r28 michael@0: STW %r28,-24(%r30) michael@0: LDW -28(%r3),%r28 michael@0: STW %r28,-28(%r30) michael@0: LDW -32(%r3),%r28 michael@0: STW %r28,-32(%r30) michael@0: michael@0: LDO -40(%r30),%r26 ; load copy address michael@0: LDW -44-framesz(%r3),%r25 ; load rest of 2 arguments michael@0: LDW -48-framesz(%r3),%r24 ; michael@0: michael@0: LDW -32(%r30),%r19 ; shared lib call destroys r19; reload michael@0: B,L .+8,%r2 michael@0: ADDIL L'invoke_copy_to_stack-$PIC_pcrel$3+4,%r2,%r1 michael@0: LDO R'invoke_copy_to_stack-$PIC_pcrel$4+8(%r1),%r1 michael@0: $PIC_pcrel$3 michael@0: LDSID (%r1),%r31 michael@0: $PIC_pcrel$4 michael@0: MTSP %r31,%sr0 michael@0: .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR ;in=24,25,26 michael@0: BE,L 0(%sr0,%r1),%r31 michael@0: COPY %r31,%r2 michael@0: michael@0: LDO -48(%r30),%r20 michael@0: EXTRW,U,= %r28,31,1,%r22 michael@0: FLDD 0(%r20),%fr7 ; load double arg 1 michael@0: EXTRW,U,= %r28,30,1,%r22 michael@0: FLDW 8(%r20),%fr5L ; load float arg 1 michael@0: EXTRW,U,= %r28,29,1,%r22 michael@0: FLDW 4(%r20),%fr6L ; load float arg 2 michael@0: EXTRW,U,= %r28,28,1,%r22 michael@0: FLDW 0(%r20),%fr7L ; load float arg 3 michael@0: michael@0: LDW -36-framesz(%r3),%r26 ; load ptr to 'that' michael@0: LDW -40(%r30),%r25 ; load the rest of dispatch argument registers michael@0: LDW -44(%r30),%r24 michael@0: LDW -48(%r30),%r23 michael@0: michael@0: LDW -36-framesz(%r3),%r20 ; load vtable addr michael@0: LDW -40-framesz(%r3),%r28 ; load index michael@0: LDW 0(%r20),%r20 ; follow vtable michael@0: LDO 16(%r20),%r20 ; offset vtable by 16 bytes (g++: 8, aCC: 16) michael@0: SH2ADDL %r28,%r20,%r28 ; add 4*index to vtable entry michael@0: LDW 0(%r28),%r22 ; load vtable entry michael@0: michael@0: B,L .+8,%r2 michael@0: ADDIL L'$$dyncall_external-$PIC_pcrel$5+4,%r2,%r1 michael@0: LDO R'$$dyncall_external-$PIC_pcrel$6+8(%r1),%r1 michael@0: $PIC_pcrel$5 michael@0: LDSID (%r1),%r31 michael@0: $PIC_pcrel$6 michael@0: MTSP %r31,%sr0 michael@0: .CALL ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR michael@0: ;in=22-26;out=28; michael@0: BE,L 0(%sr0,%r1),%r31 michael@0: COPY %r31,%r2 michael@0: michael@0: LDW -32(%r30),%r19 michael@0: COPY %r3,%r30 ; restore saved stack ptr michael@0: michael@0: LDW -148(%sp),%rp michael@0: BVE (%rp) michael@0: .EXIT michael@0: LDW,MB -128(%sp),%r3 michael@0: michael@0: .PROCEND ;in=23,24,25,26; michael@0: michael@0: .ALIGN 8 michael@0: .SPACE $TEXT$ michael@0: .SUBSPA $CODE$ michael@0: .IMPORT $$dyncall_external,MILLICODE michael@0: .IMPORT invoke_count_bytes,CODE michael@0: .IMPORT invoke_copy_to_stack,CODE michael@0: .EXPORT XPTC_InvokeByIndex,ENTRY,PRIV_LEV=3,ARGW0=GR,ARGW1=GR,ARGW2=GR,ARGW3=GR,RTNVAL=GR,LONG_RETURN michael@0: .END michael@0: