$NetBSD: patch-ca,v 1.1 2004/12/04 02:16:03 taya Exp $ --- xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_netbsd.s.orig 2001-03-11 18:22:17.000000000 +0100 +++ xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_netbsd.s @@ -1,27 +1,28 @@ -# -*- Mode: Asm -*- -# -# The contents of this file are subject to the Netscape Public -# License Version 1.1 (the "License"); you may not use this file -# except in compliance with the License. You may obtain a copy of -# the License at http://www.mozilla.org/NPL/ -# -# Software distributed under the License is distributed on an "AS -# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -# implied. See the License for the specific language governing -# rights and limitations under the License. -# -# The Original Code is mozilla.org code. -# -# The Initial Developer of the Original Code is Netscape -# Communications Corporation. Portions created by Netscape are -# Copyright (C) 1999 Netscape Communications Corporation. All -# Rights Reserved. -# -# Contributor(s): -# Franz.Sirl-kernel@lauterbach.com (Franz Sirl) -# beard@netscape.com (Patrick Beard) -# waterson@netscape.com (Chris Waterson) -# +// -*- Mode: Asm -*- +// +// The contents of this file are subject to the Netscape Public +// License Version 1.1 (the "License"); you may not use this file +// except in compliance with the License. You may obtain a copy of +// the License at http://www.mozilla.org/NPL/ +// +// Software distributed under the License is distributed on an "AS +// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or +// implied. See the License for the specific language governing +// rights and limitations under the License. +// +// The Original Code is mozilla.org code. +// +// The Initial Developer of the Original Code is Netscape +// Communications Corporation. Portions created by Netscape are +// Copyright (C) 1999 Netscape Communications Corporation. All +// Rights Reserved. +// +// Contributor(s): +// Franz.Sirl-kernel@lauterbach.com (Franz Sirl) +// beard@netscape.com (Patrick Beard) +// waterson@netscape.com (Chris Waterson) +// + .set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4 .set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9 .set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14 @@ -42,38 +43,38 @@ .globl XPTC_InvokeByIndex .type XPTC_InvokeByIndex,@function -# -# XPTC_InvokeByIndex(nsISupports* that, PRUint32 methodIndex, -# PRUint32 paramCount, nsXPTCVariant* params) -# +// +// XPTC_InvokeByIndex(nsISupports* that, PRUint32 methodIndex, +// PRUint32 paramCount, nsXPTCVariant* params) +// XPTC_InvokeByIndex: - stwu sp,-32(sp) # setup standard stack frame - mflr r0 # save LR - stw r3,8(sp) # r3 <= that - stw r4,12(sp) # r4 <= methodIndex + stwu sp,-32(sp) // setup standard stack frame + mflr r0 // save LR + stw r3,8(sp) // r3 <= that + stw r4,12(sp) // r4 <= methodIndex stw r30,16(sp) stw r31,20(sp) - stw r0,36(sp) # store LR backchain + stw r0,36(sp) // store LR backchain mr r31,sp - rlwinm r10,r5,3,0,27 # r10 = (ParamCount * 2 * 4) & ~0x0f - addi r0,r10,96 # reserve stack for GPR and FPR register save area r0 = r10 + 96 - lwz r9,0(sp) # r9 = backchain + rlwinm r10,r5,3,0,27 // r10 = (ParamCount * 2 * 4) & ~0x0f + addi r0,r10,96 // reserve stack for GPR and FPR register save area r0 = r10 + 96 + lwz r9,0(sp) // r9 = backchain neg r0,r0 - stwux r9,sp,r0 # reserve stack sapce and save SP backchain - - addi r3,sp,8 # r3 <= args - mr r4,r5 # r4 <= paramCount - mr r5,r6 # r5 <= params - add r6,r3,r10 # r6 <= gpregs ( == args + r10 ) - mr r30,r6 # store in r30 for use later... - addi r7,r6,32 # r7 <= fpregs ( == gpregs + 32 ) + stwux r9,sp,r0 // reserve stack space and save SP backchain + + addi r3,sp,8 // r3 <= args + mr r4,r5 // r4 <= paramCount + mr r5,r6 // r5 <= params + add r6,r3,r10 // r6 <= gpregs ( == args + r10 ) + mr r30,r6 // store in r30 for use later... + addi r7,r6,32 // r7 <= fpregs ( == gpregs + 32 ) - bl invoke_copy_to_stack@local # (args, paramCount, params, gpregs, fpregs) + bl invoke_copy_to_stack@local // (args, paramCount, params, gpregs, fpregs) - lfd f1,32(r30) # load FP registers with method parameters + lfd f1,32(r30) // load FP registers with method parameters lfd f2,40(r30) lfd f3,48(r30) lfd f4,56(r30) @@ -82,18 +83,18 @@ XPTC_InvokeByIndex: lfd f7,80(r30) lfd f8,88(r30) - lwz r3,8(r31) # r3 <= that - lwz r4,12(r31) # r4 <= methodIndex - lwz r5,0(r3) # r5 <= vtable ( == *that ) - slwi r4,r4,3 # convert to offset ( *= 8 ) - addi r4,r4,8 # skip first two vtable entries - add r4,r4,r5 - lhz r0,0(r4) # virtual base offset - extsh r0,r0 - add r3,r3,r0 - lwz r0,4(r4) # r0 <= methodpointer ( == vtable + offset ) + lwz r3,8(r31) // r3 <= that + lwz r4,12(r31) // r4 <= methodIndex + lwz r5,0(r3) // r5 <= vtable ( == *that ) +#if !((__GNUC__ == 3 && __GNUC_MINOR__ < 2) || __GXX_ABI_VERSION >= 100) // G++ pre-V3 ABI is like that of AIX under NetBSD + slwi r4,r4,3 // convert to offset ( *= 8 ) + addi r4,r4,8 // skip garbage before vtable +#else + slwi r4,r4,2 // convert to offset ( *= 4 ) +#endif + lwzx r0,r5,r4 // r0 <= methodpointer ( == vtable + offset ) - lwz r4,4(r30) # load GP regs with method parameters + lwz r4,4(r30) // load GP regs with method parameters lwz r5,8(r30) lwz r6,12(r30) lwz r7,16(r30) @@ -101,13 +102,13 @@ XPTC_InvokeByIndex: lwz r9,24(r30) lwz r10,28(r30) - mtlr r0 # copy methodpointer to LR - blrl # call method + mtlr r0 // copy methodpointer to LR + blrl // call method - lwz r30,16(r31) # restore r30 & r31 + lwz r30,16(r31) // restore r30 & r31 lwz r31,20(r31) - lwz r11,0(sp) # clean up the stack + lwz r11,0(sp) // clean up the stack lwz r0,4(r11) mtlr r0 mr sp,r11