summaryrefslogtreecommitdiffstats
path: root/xpcom/reflect/xptcall/md/unix/xptcinvoke_asm_pa32.s
blob: 6fa9a86ba8b8c4f6c4ad03f1cb4a2c644b8a3805 (plain)
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