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