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 +