$NetBSD: patch-xl,v 1.1.1.1 2012/03/15 09:45:29 ryoon Exp $ NetBSD ppc xptcall support code. Originally from pkgsrc/www/mozilla. --- mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_netbsd.s.orig 2012-02-16 10:25:33.000000000 +0000 +++ mozilla/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_netbsd.s @@ -1,43 +1,43 @@ -# -*- Mode: Asm -*- -# -# ***** BEGIN LICENSE BLOCK ***** -# Version: MPL 1.1/GPL 2.0/LGPL 2.1 -# -# The contents of this file are subject to the Mozilla 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/MPL/ -# -# 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 the Initial Developer are Copyright (C) 1999 -# the Initial Developer. All Rights Reserved. -# -# Contributor(s): -# Franz.Sirl-kernel@lauterbach.com (Franz Sirl) -# beard@netscape.com (Patrick Beard) -# waterson@netscape.com (Chris Waterson) -# -# Alternatively, the contents of this file may be used under the terms of -# either the GNU General Public License Version 2 or later (the "GPL"), or -# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), -# in which case the provisions of the GPL or the LGPL are applicable instead -# of those above. If you wish to allow use of your version of this file only -# under the terms of either the GPL or the LGPL, and not to allow others to -# use your version of this file under the terms of the MPL, indicate your -# decision by deleting the provisions above and replace them with the notice -# and other provisions required by the GPL or the LGPL. If you do not delete -# the provisions above, a recipient may use your version of this file under -# the terms of any one of the MPL, the GPL or the LGPL. -# -# ***** END LICENSE BLOCK ***** +// -*- Mode: Asm -*- +// +// ***** BEGIN LICENSE BLOCK ***** +// Version: MPL 1.1/GPL 2.0/LGPL 2.1 +// +// The contents of this file are subject to the Mozilla 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/MPL/ +// +// 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 the Initial Developer are Copyright (C) 1999 +// the Initial Developer. All Rights Reserved. +// +// Contributor(s): +// Franz.Sirl-kernel@lauterbach.com (Franz Sirl) +// beard@netscape.com (Patrick Beard) +// waterson@netscape.com (Chris Waterson) +// +// Alternatively, the contents of this file may be used under the terms of +// either the GNU General Public License Version 2 or later (the "GPL"), or +// the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), +// in which case the provisions of the GPL or the LGPL are applicable instead +// of those above. If you wish to allow use of your version of this file only +// under the terms of either the GPL or the LGPL, and not to allow others to +// use your version of this file under the terms of the MPL, indicate your +// decision by deleting the provisions above and replace them with the notice +// and other provisions required by the GPL or the LGPL. If you do not delete +// the provisions above, a recipient may use your version of this file under +// the terms of any one of the MPL, the GPL or the LGPL. +// +// ***** END LICENSE BLOCK ***** .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 @@ -55,41 +55,41 @@ .section ".text" .align 2 - .globl XPTC_InvokeByIndex - .type XPTC_InvokeByIndex,@function + .globl NS_InvokeByIndex_P + .type NS_InvokeByIndex_P,@function -# -# 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 +// +// NS_InvokeByIndex_P(nsISupports* that, PRUint32 methodIndex, +// PRUint32 paramCount, nsXPTCVariant* params) +// + +NS_InvokeByIndex_P: + 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 + 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 ) + 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) @@ -98,18 +98,13 @@ 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 ) + slwi r4,r4,2 // convert to offset ( *= 4 ) + lwzx r0,r4,r5 // 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) @@ -117,13 +112,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