1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_rhapsody.s Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,142 @@ 1.4 +# 1.5 +# -*- Mode: Asm -*- 1.6 +# 1.7 +# This Source Code Form is subject to the terms of the Mozilla Public 1.8 +# License, v. 2.0. If a copy of the MPL was not distributed with this 1.9 +# file, You can obtain one at http://mozilla.org/MPL/2.0/. 1.10 + 1.11 +# 1.12 +# ** Assumed vtable layout (obtained by disassembling with gdb): 1.13 +# ** 4 bytes per vtable entry, skip 0th and 1st entries, so the mapping 1.14 +# ** from index to entry is (4 * index) + 8. 1.15 +# 1.16 + 1.17 +.text 1.18 + .align 2 1.19 +# 1.20 +# NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, 1.21 +# uint32_t paramCount, nsXPTCVariant* params) 1.22 +# 1.23 + 1.24 +.globl __NS_InvokeByIndex 1.25 +__NS_InvokeByIndex: 1.26 + mflr r0 1.27 + stw r31,-4(r1) 1.28 +# 1.29 +# save off the incoming values in the callers parameter area 1.30 +# 1.31 + stw r3,24(r1) ; that 1.32 + stw r4,28(r1) ; methodIndex 1.33 + stw r5,32(r1) ; paramCount 1.34 + stw r6,36(r1) ; params 1.35 + stw r0,8(r1) 1.36 + stwu r1,-144(r1) ; 24 for linkage area, 1.37 + ; 8*13 for fprData area, 1.38 + ; 8 for saved registers, 1.39 + ; 8 to keep stack 16-byte aligned 1.40 + 1.41 +# set up for and call 'invoke_count_words' to get new stack size 1.42 +# 1.43 + mr r3,r5 1.44 + mr r4,r6 1.45 + 1.46 + stwu r1,-24(r1) 1.47 + bl L_invoke_count_words$stub 1.48 + lwz r1,0(r1) 1.49 + 1.50 +# prepare args for 'invoke_copy_to_stack' call 1.51 +# 1.52 + lwz r4,176(r1) ; paramCount 1.53 + lwz r5,180(r1) ; params 1.54 + mr r6,r1 ; fprData 1.55 + slwi r3,r3,2 ; number of stack bytes required 1.56 + addi r3,r3,28 ; linkage area 1.57 + mr r31,r1 ; save original stack top 1.58 + sub r1,r1,r3 ; bump the stack 1.59 + clrrwi r1,r1,4 ; keep the stack 16-byte aligned 1.60 + addi r3,r31,144 ; act like real alloca, so 0(sp) always 1.61 + stw r3,0(r1) ; points back to previous stack frame 1.62 + addi r3,r1,28 ; parameter pointer excludes linkage area size + 'this' 1.63 + 1.64 +# create "temporary" stack frame for _invoke_copy_to_stack to operate in. 1.65 + stwu r1,-40(r1) 1.66 + bl L_invoke_copy_to_stack$stub 1.67 +# remove temporary stack frame. 1.68 + lwz r1,0(r1) 1.69 + 1.70 + lfd f1,0(r31) 1.71 + lfd f2,8(r31) 1.72 + lfd f3,16(r31) 1.73 + lfd f4,24(r31) 1.74 + lfd f5,32(r31) 1.75 + lfd f6,40(r31) 1.76 + lfd f7,48(r31) 1.77 + lfd f8,56(r31) 1.78 + lfd f9,64(r31) 1.79 + lfd f10,72(r31) 1.80 + lfd f11,80(r31) 1.81 + lfd f12,88(r31) 1.82 + lfd f13,96(r31) 1.83 + 1.84 + lwz r3,168(r31) ; that 1.85 + lwz r4,0(r3) ; get vTable from 'that' 1.86 + lwz r5,172(r31) ; methodIndex 1.87 + slwi r5,r5,2 ; methodIndex * 4 1.88 + lwzx r12,r5,r4 ; get function pointer 1.89 + 1.90 + lwz r4,28(r1) 1.91 + lwz r5,32(r1) 1.92 + lwz r6,36(r1) 1.93 + lwz r7,40(r1) 1.94 + lwz r8,44(r1) 1.95 + lwz r9,48(r1) 1.96 + lwz r10,52(r1) 1.97 + 1.98 + mtlr r12 1.99 + blrl 1.100 + 1.101 + mr r1,r31 1.102 + lwz r0,152(r1) 1.103 + addi r1,r1,144 1.104 + mtlr r0 1.105 + lwz r31,-4(r1) 1.106 + 1.107 + blr 1.108 + 1.109 +.picsymbol_stub 1.110 +L_invoke_count_words$stub: 1.111 + .indirect_symbol _invoke_count_words 1.112 + mflr r0 1.113 + bcl 20,31,L1$pb 1.114 +L1$pb: 1.115 + mflr r11 1.116 + addis r11,r11,ha16(L1$lz-L1$pb) 1.117 + mtlr r0 1.118 + lwz r12,lo16(L1$lz-L1$pb)(r11) 1.119 + mtctr r12 1.120 + addi r11,r11,lo16(L1$lz-L1$pb) 1.121 + bctr 1.122 +.lazy_symbol_pointer 1.123 +L1$lz: 1.124 + .indirect_symbol _invoke_count_words 1.125 + .long dyld_stub_binding_helper 1.126 + 1.127 + 1.128 +.picsymbol_stub 1.129 +L_invoke_copy_to_stack$stub: 1.130 + .indirect_symbol _invoke_copy_to_stack 1.131 + mflr r0 1.132 + bcl 20,31,L2$pb 1.133 +L2$pb: 1.134 + mflr r11 1.135 + addis r11,r11,ha16(L2$lz-L2$pb) 1.136 + mtlr r0 1.137 + lwz r12,lo16(L2$lz-L2$pb)(r11) 1.138 + mtctr r12 1.139 + addi r11,r11,lo16(L2$lz-L2$pb) 1.140 + bctr 1.141 +.lazy_symbol_pointer 1.142 +L2$lz: 1.143 + .indirect_symbol _invoke_copy_to_stack 1.144 + .long dyld_stub_binding_helper 1.145 +