xpcom/reflect/xptcall/src/md/unix/xptcinvoke_asm_ppc_aix.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_aix.s	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,129 @@
     1.4 +#
     1.5 +# -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     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 +.set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
    1.12 +.set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
    1.13 +.set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
    1.14 +.set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
    1.15 +.set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
    1.16 +.set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
    1.17 +.set r30,30; .set r31,31
    1.18 +.set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
    1.19 +.set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
    1.20 +.set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
    1.21 +.set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
    1.22 +.set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
    1.23 +.set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
    1.24 +.set f30,30; .set f31,31
    1.25 +.set BO_IF,12
    1.26 +.set CR0_EQ,2
    1.27 +
    1.28 +
    1.29 +
    1.30 +        .rename H.10.NO_SYMBOL{PR},""
    1.31 +        .rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex"
    1.32 +
    1.33 +
    1.34 +# .text section
    1.35 +
    1.36 +        .csect  H.10.NO_SYMBOL{PR}
    1.37 +        .globl  .NS_InvokeByIndex
    1.38 +        .globl  NS_InvokeByIndex{DS}
    1.39 +        .extern .invoke_copy_to_stack
    1.40 +        .extern ._ptrgl{PR}
    1.41 +
    1.42 +
    1.43 +#
    1.44 +#   NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
    1.45 +#                   uint32_t paramCount, nsXPTCVariant* params)
    1.46 +#
    1.47 +
    1.48 +.NS_InvokeByIndex:
    1.49 +		mflr	r0
    1.50 +		stw	r31,-4(sp)
    1.51 +#
    1.52 +# save off the incoming values in the caller's parameter area
    1.53 +#		
    1.54 +		stw	r3,24(sp)		# that
    1.55 +		stw	r4,28(sp)		# methodIndex
    1.56 +		stw	r5,32(sp)		# paramCount
    1.57 +		stw	r6,36(sp)		# params
    1.58 +		stw	r0,8(sp)
    1.59 +		stwu	sp,-136(sp)		#  = 24 for linkage area,  8 * 13 for fprData area, 8 for saved registers
    1.60 +
    1.61 +# prepare args for 'invoke_copy_to_stack' call
    1.62 +#		
    1.63 +		lwz	r4,168(sp)		# paramCount
    1.64 +		lwz	r5,172(sp)		# params
    1.65 +		mr	r6,sp			# fprData
    1.66 +		slwi	r3,r4,3			# number of bytes of stack required
    1.67 +								# at most 8*paramCount
    1.68 +		addi	r3,r3,28		# linkage area
    1.69 +		mr	r31,sp			# save original stack top
    1.70 +		subfc	sp,r3,sp		# bump the stack
    1.71 +		addi	r3,sp,28		# parameter pointer excludes linkage area size + 'this'
    1.72 +		
    1.73 +		bl	.invoke_copy_to_stack
    1.74 +		nop
    1.75 +		
    1.76 +		lfd	f1,0(r31)		# Restore floating point registers	
    1.77 +		lfd	f2,8(r31)				
    1.78 +		lfd	f3,16(r31)				
    1.79 +		lfd	f4,24(r31)				
    1.80 +		lfd	f5,32(r31)				
    1.81 +		lfd	f6,40(r31)				
    1.82 +		lfd	f7,48(r31)				
    1.83 +		lfd	f8,56(r31)				
    1.84 +		lfd	f9,64(r31)				
    1.85 +		lfd	f10,72(r31)				
    1.86 +		lfd	f11,80(r31)				
    1.87 +		lfd	f12,88(r31)				
    1.88 +		lfd	f13,96(r31)				
    1.89 +		
    1.90 +		lwz	r3,160(r31)		# that
    1.91 +		lwz	r4,0(r3)		# get vTable from 'that'
    1.92 +		lwz	r5,164(r31)		# methodIndex
    1.93 +		slwi	r5,r5,3			# methodIndex * 8
    1.94 +		addi	r5,r5,8			# step over junk at start of vTable !
    1.95 +		lwzx	r11,r5,r4		# get function pointer
    1.96 +
    1.97 +		addi	r5,r5,4    	 	# We need to manually adjust the 'that' pointer, this is CFRONT based
    1.98 +		lwzx	r5,r4,r5 		# offset = r4(vtable) + r5(methodIndex offset) - 4 
    1.99 +		add	r3,r5,r3		# adjust 'that' r3 = r3 + r5
   1.100 +		
   1.101 +		lwz	r4,28(sp)
   1.102 +		lwz	r5,32(sp)
   1.103 +		lwz	r6,36(sp)
   1.104 +		lwz	r7,40(sp)
   1.105 +		lwz	r8,44(sp)
   1.106 +		lwz	r9,48(sp)
   1.107 +		lwz	r10,52(sp)
   1.108 +
   1.109 +		bl      ._ptrgl{PR}
   1.110 +		nop		
   1.111 +		
   1.112 +		mr      sp,r31
   1.113 +		lwz	r0,144(sp)
   1.114 +		addi    sp,sp,136
   1.115 +		mtlr    r0
   1.116 +		lwz     r31,-4(sp)
   1.117 +	        blr
   1.118 +
   1.119 +
   1.120 +# .data section
   1.121 +
   1.122 +        .toc                            # 0x00000038
   1.123 +T.18.NS_InvokeByIndex:
   1.124 +        .tc     H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
   1.125 +
   1.126 +        .csect  NS_InvokeByIndex{DS}
   1.127 +        .long   .NS_InvokeByIndex     # "\0\0\0\0"
   1.128 +        .long   TOC{TC0}                # "\0\0\0008"
   1.129 +        .long   0x00000000              # "\0\0\0\0"
   1.130 +# End   csect   NS_InvokeByIndex{DS}
   1.131 +
   1.132 +# .bss section	

mercurial