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
8LOCALSZ=16
9FRAMESZ=(((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
10
11A1OFF=FRAMESZ-(9*SZREG)
12A2OFF=FRAMESZ-(8*SZREG)
13A3OFF=FRAMESZ-(7*SZREG)
14A4OFF=FRAMESZ-(6*SZREG)
15A5OFF=FRAMESZ-(5*SZREG)
16A6OFF=FRAMESZ-(4*SZREG)
17A7OFF=FRAMESZ-(3*SZREG)
18GPOFF=FRAMESZ-(2*SZREG)
19RAOFF=FRAMESZ-(1*SZREG)
20
21F13OFF=FRAMESZ-(16*SZREG)
22F14OFF=FRAMESZ-(15*SZREG)
23F15OFF=FRAMESZ-(14*SZREG)
24F16OFF=FRAMESZ-(13*SZREG)
25F17OFF=FRAMESZ-(12*SZREG)
26F18OFF=FRAMESZ-(11*SZREG)
27F19OFF=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;                                    \
46name:;                                                  \
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
59dummy:
60    .frame   sp, FRAMESZ, ra
61    .mask    0x90000FF0, RAOFF-FRAMESZ
62    .fmask   0x000FF000, F19OFF-FRAMESZ
63
64#include "xptcstubsdef.inc"
65
66sharedstub:
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    PTR_ADDI a2, FRAMESZ
92
93    # a3 is stack address of a1..a7
94    move     a3, sp
95    PTR_ADDI a3, A1OFF
96
97    # a4 is stack address of f13..f19
98    move     a4, sp
99    PTR_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)
112