xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_rhapsody.s

changeset 0
6474c204b198
     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 +

mercurial