]> gitweb @ CieloNegro.org - pkgsrc-firefox3.git/commitdiff
Placed missing xptcinvoke_asm_ppc_rhapsody.s into files/.
authorPHO <pho@cielonegro.org>
Tue, 3 Feb 2009 15:15:29 +0000 (00:15 +0900)
committerPHO <pho@cielonegro.org>
Tue, 3 Feb 2009 15:15:29 +0000 (00:15 +0900)
files/xptcinvoke_asm_ppc_rhapsody.s [new file with mode: 0644]

diff --git a/files/xptcinvoke_asm_ppc_rhapsody.s b/files/xptcinvoke_asm_ppc_rhapsody.s
new file mode 100644 (file)
index 0000000..c345d81
--- /dev/null
@@ -0,0 +1,178 @@
+#
+# -*- 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):
+#   Patrick C. Beard <beard@netscape.com>
+#
+# 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 *****
+
+# 
+# ** Assumed vtable layout (obtained by disassembling with gdb):
+# ** 4 bytes per vtable entry, skip 0th and 1st entries, so the mapping
+# ** from index to entry is (4 * index) + 8.
+#
+
+.text
+       .align 2
+#
+#   NS_InvokeByIndex_P(nsISupports* that, PRUint32 methodIndex,
+#                    PRUint32 paramCount, nsXPTCVariant* params)
+#
+
+.globl __NS_InvokeByIndex_P    
+__NS_InvokeByIndex_P:
+       mflr    r0
+       stw     r31,-4(r1)
+#
+# save off the incoming values in the callers parameter area
+#              
+       stw     r3,24(r1)               ; that
+       stw     r4,28(r1)               ; methodIndex
+       stw     r5,32(r1)               ; paramCount
+       stw     r6,36(r1)               ; params
+       stw     r0,8(r1)
+       stwu    r1,-144(r1)             ; 24 for linkage area, 
+                                        ; 8*13 for fprData area,
+                                        ; 8 for saved registers,
+                                        ; 8 to keep stack 16-byte aligned
+
+# set up for and call 'invoke_count_words' to get new stack size
+#      
+       mr      r3,r5
+       mr      r4,r6
+
+       stwu    r1,-24(r1)      
+       bl      L_invoke_count_words$stub
+       lwz     r1,0(r1)
+
+# prepare args for 'invoke_copy_to_stack' call
+#              
+       lwz     r4,176(r1)              ; paramCount
+       lwz     r5,180(r1)              ; params
+       mr      r6,r1                   ; fprData
+       slwi    r3,r3,2                 ; number of stack bytes required
+       addi    r3,r3,28                ; linkage area
+       mr      r31,r1                  ; save original stack top
+       sub     r1,r1,r3                ; bump the stack
+       clrrwi  r1,r1,4                 ; keep the stack 16-byte aligned
+       addi    r3,r31,144              ; act like real alloca, so 0(sp) always
+       stw     r3,0(r1)                ;  points back to previous stack frame
+       addi    r3,r1,28                ; parameter pointer excludes linkage area size + 'this'
+       
+# create "temporary" stack frame for _invoke_copy_to_stack to operate in.
+       stwu    r1,-40(r1)
+       bl      L_invoke_copy_to_stack$stub
+# remove temporary stack frame.
+       lwz     r1,0(r1)
+
+       lfd     f1,0(r31)                               
+       lfd     f2,8(r31)                               
+       lfd     f3,16(r31)                              
+       lfd     f4,24(r31)                              
+       lfd     f5,32(r31)                              
+       lfd     f6,40(r31)                              
+       lfd     f7,48(r31)                              
+       lfd     f8,56(r31)                              
+       lfd     f9,64(r31)                              
+       lfd     f10,72(r31)                             
+       lfd     f11,80(r31)                             
+       lfd     f12,88(r31)                             
+       lfd     f13,96(r31)                             
+       
+       lwz     r3,168(r31)             ; that
+       lwz     r4,0(r3)                ; get vTable from 'that'
+       lwz     r5,172(r31)             ; methodIndex
+       slwi    r5,r5,2                 ; methodIndex * 4
+#ifndef HAVE_GCC3_ABI
+       addi    r5,r5,8                 ; (methodIndex * 4) + 8
+#endif
+       lwzx    r12,r5,r4               ; get function pointer
+
+       lwz     r4,28(r1)
+       lwz     r5,32(r1)
+       lwz     r6,36(r1)
+       lwz     r7,40(r1)
+       lwz     r8,44(r1)
+       lwz     r9,48(r1)
+       lwz     r10,52(r1)
+       
+       mtlr    r12
+       blrl
+       
+       mr      r1,r31
+       lwz     r0,152(r1)
+       addi    r1,r1,144
+       mtlr    r0
+       lwz     r31,-4(r1)
+
+       blr
+
+.picsymbol_stub
+L_invoke_count_words$stub:
+        .indirect_symbol _invoke_count_words
+        mflr r0
+        bcl 20,31,L1$pb
+L1$pb:
+        mflr r11
+        addis r11,r11,ha16(L1$lz-L1$pb)
+        mtlr r0
+        lwz r12,lo16(L1$lz-L1$pb)(r11)
+        mtctr r12
+        addi r11,r11,lo16(L1$lz-L1$pb)
+        bctr
+.lazy_symbol_pointer
+L1$lz:
+        .indirect_symbol _invoke_count_words
+        .long dyld_stub_binding_helper
+
+
+.picsymbol_stub
+L_invoke_copy_to_stack$stub:
+        .indirect_symbol _invoke_copy_to_stack
+        mflr r0
+        bcl 20,31,L2$pb
+L2$pb:
+        mflr r11
+        addis r11,r11,ha16(L2$lz-L2$pb)
+        mtlr r0
+        lwz r12,lo16(L2$lz-L2$pb)(r11)
+        mtctr r12
+        addi r11,r11,lo16(L2$lz-L2$pb)
+        bctr
+.lazy_symbol_pointer
+L2$lz:
+        .indirect_symbol _invoke_copy_to_stack
+        .long dyld_stub_binding_helper
+