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)