xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_mips64.S

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:2ec6aed32056
1 /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include <sys/regdef.h>
6 #include <sys/asm.h>
7
8 LOCALSZ=16
9 FRAMESZ=(((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
10
11 A1OFF=FRAMESZ-(9*SZREG)
12 A2OFF=FRAMESZ-(8*SZREG)
13 A3OFF=FRAMESZ-(7*SZREG)
14 A4OFF=FRAMESZ-(6*SZREG)
15 A5OFF=FRAMESZ-(5*SZREG)
16 A6OFF=FRAMESZ-(4*SZREG)
17 A7OFF=FRAMESZ-(3*SZREG)
18 GPOFF=FRAMESZ-(2*SZREG)
19 RAOFF=FRAMESZ-(1*SZREG)
20
21 F13OFF=FRAMESZ-(16*SZREG)
22 F14OFF=FRAMESZ-(15*SZREG)
23 F15OFF=FRAMESZ-(14*SZREG)
24 F16OFF=FRAMESZ-(13*SZREG)
25 F17OFF=FRAMESZ-(12*SZREG)
26 F18OFF=FRAMESZ-(11*SZREG)
27 F19OFF=FRAMESZ-(10*SZREG)
28
29 #define SENTINEL_ENTRY(n) /* defined in cpp file, not here */
30
31 #define STUB_ENTRY(x) \
32 .if x < 10; \
33 MAKE_STUB(x, _ZN14nsXPTCStubBase5Stub ##x ##Ev); \
34 .elseif x < 100; \
35 MAKE_STUB(x, _ZN14nsXPTCStubBase6Stub ##x ##Ev); \
36 .elseif x < 1000; \
37 MAKE_STUB(x, _ZN14nsXPTCStubBase7Stub ##x ##Ev); \
38 .else; \
39 .err; \
40 .endif
41
42 #define MAKE_STUB(x, name) \
43 .globl name; \
44 .type name,@function; \
45 .aent name,0; \
46 name:; \
47 PTR_SUBU sp,FRAMESZ; \
48 SETUP_GP64(GPOFF, name); \
49 li t0,x; \
50 b sharedstub; \
51
52 #
53 # open a dummy frame for the function entries
54 #
55 .text
56 .align 2
57 .type dummy,@function
58 .ent dummy, 0
59 dummy:
60 .frame sp, FRAMESZ, ra
61 .mask 0x90000FF0, RAOFF-FRAMESZ
62 .fmask 0x000FF000, F19OFF-FRAMESZ
63
64 #include "xptcstubsdef.inc"
65
66 sharedstub:
67
68 REG_S a1, A1OFF(sp)
69 REG_S a2, A2OFF(sp)
70 REG_S a3, A3OFF(sp)
71 REG_S a4, A4OFF(sp)
72 REG_S a5, A5OFF(sp)
73 REG_S a6, A6OFF(sp)
74 REG_S a7, A7OFF(sp)
75 REG_S ra, RAOFF(sp)
76
77 s.d $f13, F13OFF(sp)
78 s.d $f14, F14OFF(sp)
79 s.d $f15, F15OFF(sp)
80 s.d $f16, F16OFF(sp)
81 s.d $f17, F17OFF(sp)
82 s.d $f18, F18OFF(sp)
83 s.d $f19, F19OFF(sp)
84
85 # t0 is methodIndex
86 move a1, t0
87
88 # a2 is stack address where extra function params
89 # are stored that do not fit in registers
90 move a2, sp
91 addi a2, FRAMESZ
92
93 # a3 is stack address of a1..a7
94 move a3, sp
95 addi a3, A1OFF
96
97 # a4 is stack address of f13..f19
98 move a4, sp
99 addi a4, F13OFF
100
101 # PrepareAndDispatch(that, methodIndex, args, gprArgs, fpArgs)
102 # a0 a1 a2 a3 a4
103 #
104 jal PrepareAndDispatch
105
106 REG_L ra, RAOFF(sp)
107 RESTORE_GP64
108
109 PTR_ADDU sp, FRAMESZ
110 j ra
111 END(dummy)

mercurial