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

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/xpcom/reflect/xptcall/src/md/unix/xptcstubs_asm_mips64.S	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,111 @@
     1.4 +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public
     1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.8 +#include <sys/regdef.h>
     1.9 +#include <sys/asm.h>
    1.10 +
    1.11 +LOCALSZ=16
    1.12 +FRAMESZ=(((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
    1.13 +
    1.14 +A1OFF=FRAMESZ-(9*SZREG)
    1.15 +A2OFF=FRAMESZ-(8*SZREG)
    1.16 +A3OFF=FRAMESZ-(7*SZREG)
    1.17 +A4OFF=FRAMESZ-(6*SZREG)
    1.18 +A5OFF=FRAMESZ-(5*SZREG)
    1.19 +A6OFF=FRAMESZ-(4*SZREG)
    1.20 +A7OFF=FRAMESZ-(3*SZREG)
    1.21 +GPOFF=FRAMESZ-(2*SZREG)
    1.22 +RAOFF=FRAMESZ-(1*SZREG)
    1.23 +
    1.24 +F13OFF=FRAMESZ-(16*SZREG)
    1.25 +F14OFF=FRAMESZ-(15*SZREG)
    1.26 +F15OFF=FRAMESZ-(14*SZREG)
    1.27 +F16OFF=FRAMESZ-(13*SZREG)
    1.28 +F17OFF=FRAMESZ-(12*SZREG)
    1.29 +F18OFF=FRAMESZ-(11*SZREG)
    1.30 +F19OFF=FRAMESZ-(10*SZREG)
    1.31 +
    1.32 +#define SENTINEL_ENTRY(n)         /* defined in cpp file, not here */
    1.33 +
    1.34 +#define STUB_ENTRY(x)                                   \
    1.35 +    .if x < 10;                                         \
    1.36 +    MAKE_STUB(x, _ZN14nsXPTCStubBase5Stub ##x ##Ev);    \
    1.37 +    .elseif x < 100;                                    \
    1.38 +    MAKE_STUB(x, _ZN14nsXPTCStubBase6Stub ##x ##Ev);    \
    1.39 +    .elseif x < 1000;                                   \
    1.40 +    MAKE_STUB(x, _ZN14nsXPTCStubBase7Stub ##x ##Ev);    \
    1.41 +    .else;                                              \
    1.42 +    .err;                                               \
    1.43 +    .endif
    1.44 +
    1.45 +#define MAKE_STUB(x, name)                              \
    1.46 +    .globl   name;                                      \
    1.47 +    .type    name,@function;                            \
    1.48 +    .aent    name,0;                                    \
    1.49 +name:;                                                  \
    1.50 +    PTR_SUBU sp,FRAMESZ;                                \
    1.51 +    SETUP_GP64(GPOFF, name);                            \
    1.52 +    li       t0,x;                                      \
    1.53 +    b        sharedstub;                                \
    1.54 +
    1.55 +#
    1.56 +# open a dummy frame for the function entries
    1.57 +#
    1.58 +    .text
    1.59 +    .align   2
    1.60 +    .type    dummy,@function
    1.61 +    .ent     dummy, 0
    1.62 +dummy:
    1.63 +    .frame   sp, FRAMESZ, ra
    1.64 +    .mask    0x90000FF0, RAOFF-FRAMESZ
    1.65 +    .fmask   0x000FF000, F19OFF-FRAMESZ
    1.66 +
    1.67 +#include "xptcstubsdef.inc"
    1.68 +
    1.69 +sharedstub:
    1.70 +
    1.71 +    REG_S    a1, A1OFF(sp)
    1.72 +    REG_S    a2, A2OFF(sp)
    1.73 +    REG_S    a3, A3OFF(sp)
    1.74 +    REG_S    a4, A4OFF(sp)
    1.75 +    REG_S    a5, A5OFF(sp)
    1.76 +    REG_S    a6, A6OFF(sp)
    1.77 +    REG_S    a7, A7OFF(sp)
    1.78 +    REG_S    ra, RAOFF(sp)
    1.79 +
    1.80 +    s.d      $f13, F13OFF(sp)
    1.81 +    s.d      $f14, F14OFF(sp)
    1.82 +    s.d      $f15, F15OFF(sp)
    1.83 +    s.d      $f16, F16OFF(sp)
    1.84 +    s.d      $f17, F17OFF(sp)
    1.85 +    s.d      $f18, F18OFF(sp)
    1.86 +    s.d      $f19, F19OFF(sp)
    1.87 +
    1.88 +    # t0 is methodIndex
    1.89 +    move     a1, t0
    1.90 +
    1.91 +    # a2 is stack address where extra function params
    1.92 +    # are stored that do not fit in registers
    1.93 +    move     a2, sp
    1.94 +    addi     a2, FRAMESZ
    1.95 +
    1.96 +    # a3 is stack address of a1..a7
    1.97 +    move     a3, sp
    1.98 +    addi     a3, A1OFF
    1.99 +
   1.100 +    # a4 is stack address of f13..f19
   1.101 +    move     a4, sp
   1.102 +    addi     a4, F13OFF
   1.103 +
   1.104 +    # PrepareAndDispatch(that, methodIndex, args, gprArgs, fpArgs)
   1.105 +    #                     a0       a1        a2     a3       a4
   1.106 +    #
   1.107 +    jal      PrepareAndDispatch
   1.108 +
   1.109 +    REG_L    ra, RAOFF(sp)
   1.110 +    RESTORE_GP64
   1.111 +
   1.112 +    PTR_ADDU sp, FRAMESZ
   1.113 +    j        ra
   1.114 +    END(dummy)

mercurial