michael@0: # michael@0: # -*- Mode: Asm -*- michael@0: # michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: # file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: # michael@0: # ** Assumed vtable layout (obtained by disassembling with gdb): michael@0: # ** 4 bytes per vtable entry, skip 0th and 1st entries, so the mapping michael@0: # ** from index to entry is (4 * index) + 8. michael@0: # michael@0: michael@0: .text michael@0: .align 2 michael@0: # michael@0: # NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex, michael@0: # uint32_t paramCount, nsXPTCVariant* params) michael@0: # michael@0: michael@0: .globl __NS_InvokeByIndex michael@0: __NS_InvokeByIndex: michael@0: mflr r0 michael@0: stw r31,-4(r1) michael@0: # michael@0: # save off the incoming values in the callers parameter area michael@0: # michael@0: stw r3,24(r1) ; that michael@0: stw r4,28(r1) ; methodIndex michael@0: stw r5,32(r1) ; paramCount michael@0: stw r6,36(r1) ; params michael@0: stw r0,8(r1) michael@0: stwu r1,-144(r1) ; 24 for linkage area, michael@0: ; 8*13 for fprData area, michael@0: ; 8 for saved registers, michael@0: ; 8 to keep stack 16-byte aligned michael@0: michael@0: # set up for and call 'invoke_count_words' to get new stack size michael@0: # michael@0: mr r3,r5 michael@0: mr r4,r6 michael@0: michael@0: stwu r1,-24(r1) michael@0: bl L_invoke_count_words$stub michael@0: lwz r1,0(r1) michael@0: michael@0: # prepare args for 'invoke_copy_to_stack' call michael@0: # michael@0: lwz r4,176(r1) ; paramCount michael@0: lwz r5,180(r1) ; params michael@0: mr r6,r1 ; fprData michael@0: slwi r3,r3,2 ; number of stack bytes required michael@0: addi r3,r3,28 ; linkage area michael@0: mr r31,r1 ; save original stack top michael@0: sub r1,r1,r3 ; bump the stack michael@0: clrrwi r1,r1,4 ; keep the stack 16-byte aligned michael@0: addi r3,r31,144 ; act like real alloca, so 0(sp) always michael@0: stw r3,0(r1) ; points back to previous stack frame michael@0: addi r3,r1,28 ; parameter pointer excludes linkage area size + 'this' michael@0: michael@0: # create "temporary" stack frame for _invoke_copy_to_stack to operate in. michael@0: stwu r1,-40(r1) michael@0: bl L_invoke_copy_to_stack$stub michael@0: # remove temporary stack frame. michael@0: lwz r1,0(r1) michael@0: michael@0: lfd f1,0(r31) michael@0: lfd f2,8(r31) michael@0: lfd f3,16(r31) michael@0: lfd f4,24(r31) michael@0: lfd f5,32(r31) michael@0: lfd f6,40(r31) michael@0: lfd f7,48(r31) michael@0: lfd f8,56(r31) michael@0: lfd f9,64(r31) michael@0: lfd f10,72(r31) michael@0: lfd f11,80(r31) michael@0: lfd f12,88(r31) michael@0: lfd f13,96(r31) michael@0: michael@0: lwz r3,168(r31) ; that michael@0: lwz r4,0(r3) ; get vTable from 'that' michael@0: lwz r5,172(r31) ; methodIndex michael@0: slwi r5,r5,2 ; methodIndex * 4 michael@0: lwzx r12,r5,r4 ; get function pointer michael@0: michael@0: lwz r4,28(r1) michael@0: lwz r5,32(r1) michael@0: lwz r6,36(r1) michael@0: lwz r7,40(r1) michael@0: lwz r8,44(r1) michael@0: lwz r9,48(r1) michael@0: lwz r10,52(r1) michael@0: michael@0: mtlr r12 michael@0: blrl michael@0: michael@0: mr r1,r31 michael@0: lwz r0,152(r1) michael@0: addi r1,r1,144 michael@0: mtlr r0 michael@0: lwz r31,-4(r1) michael@0: michael@0: blr michael@0: michael@0: .picsymbol_stub michael@0: L_invoke_count_words$stub: michael@0: .indirect_symbol _invoke_count_words michael@0: mflr r0 michael@0: bcl 20,31,L1$pb michael@0: L1$pb: michael@0: mflr r11 michael@0: addis r11,r11,ha16(L1$lz-L1$pb) michael@0: mtlr r0 michael@0: lwz r12,lo16(L1$lz-L1$pb)(r11) michael@0: mtctr r12 michael@0: addi r11,r11,lo16(L1$lz-L1$pb) michael@0: bctr michael@0: .lazy_symbol_pointer michael@0: L1$lz: michael@0: .indirect_symbol _invoke_count_words michael@0: .long dyld_stub_binding_helper michael@0: michael@0: michael@0: .picsymbol_stub michael@0: L_invoke_copy_to_stack$stub: michael@0: .indirect_symbol _invoke_copy_to_stack michael@0: mflr r0 michael@0: bcl 20,31,L2$pb michael@0: L2$pb: michael@0: mflr r11 michael@0: addis r11,r11,ha16(L2$lz-L2$pb) michael@0: mtlr r0 michael@0: lwz r12,lo16(L2$lz-L2$pb)(r11) michael@0: mtctr r12 michael@0: addi r11,r11,lo16(L2$lz-L2$pb) michael@0: bctr michael@0: .lazy_symbol_pointer michael@0: L2$lz: michael@0: .indirect_symbol _invoke_copy_to_stack michael@0: .long dyld_stub_binding_helper michael@0: