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

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 # This Source Code Form is subject to the terms of the Mozilla Public
michael@0 2 # License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
michael@0 4
michael@0 5 .set r0,0; .set sp,1; .set RTOC,2; .set r3,3; .set r4,4
michael@0 6 .set r5,5; .set r6,6; .set r7,7; .set r8,8; .set r9,9
michael@0 7 .set r10,10; .set r11,11; .set r12,12; .set r13,13; .set r14,14
michael@0 8 .set r15,15; .set r16,16; .set r17,17; .set r18,18; .set r19,19
michael@0 9 .set r20,20; .set r21,21; .set r22,22; .set r23,23; .set r24,24
michael@0 10 .set r25,25; .set r26,26; .set r27,27; .set r28,28; .set r29,29
michael@0 11 .set r30,30; .set r31,31
michael@0 12 .set f0,0; .set f1,1; .set f2,2; .set f3,3; .set f4,4
michael@0 13 .set f5,5; .set f6,6; .set f7,7; .set f8,8; .set f9,9
michael@0 14 .set f10,10; .set f11,11; .set f12,12; .set f13,13; .set f14,14
michael@0 15 .set f15,15; .set f16,16; .set f17,17; .set f18,18; .set f19,19
michael@0 16 .set f20,20; .set f21,21; .set f22,22; .set f23,23; .set f24,24
michael@0 17 .set f25,25; .set f26,26; .set f27,27; .set f28,28; .set f29,29
michael@0 18 .set f30,30; .set f31,31
michael@0 19 .set BO_IF,12
michael@0 20 .set CR0_EQ,2
michael@0 21
michael@0 22 .rename H.10.NO_SYMBOL{PR},""
michael@0 23 .rename H.18.NS_InvokeByIndex{TC},"NS_InvokeByIndex"
michael@0 24
michael@0 25
michael@0 26 # .text section
michael@0 27
michael@0 28 .csect H.10.NO_SYMBOL{PR}
michael@0 29 .globl .NS_InvokeByIndex
michael@0 30 .globl NS_InvokeByIndex{DS}
michael@0 31 .extern .invoke_copy_to_stack
michael@0 32 .extern ._ptrgl{PR}
michael@0 33
michael@0 34 #
michael@0 35 # NS_InvokeByIndex(nsISupports* that, uint32_t methodIndex,
michael@0 36 # uint32_t paramCount, nsXPTCVariant* params)
michael@0 37 #
michael@0 38
michael@0 39 .NS_InvokeByIndex:
michael@0 40 mflr r0
michael@0 41 std r31,-8(sp)
michael@0 42 #
michael@0 43 # save off the incoming values in the caller's parameter area
michael@0 44 #
michael@0 45 std r3,48(sp) # that
michael@0 46 std r4,56(sp) # methodIndex
michael@0 47 std r5,64(sp) # paramCount
michael@0 48 std r6,72(sp) # params
michael@0 49 std r0,16(sp)
michael@0 50 stdu sp,-168(sp) # 2*24=48 for linkage area,
michael@0 51 # 8*13=104 for fprData area
michael@0 52 # 16 for saved registers
michael@0 53
michael@0 54 # prepare args for 'invoke_copy_to_stack' call
michael@0 55 #
michael@0 56 ld r4,232(sp) # paramCount (168+8+56)
michael@0 57 ld r5,240(sp) # params
michael@0 58 mr r6,sp # fprData
michael@0 59 sldi r3,r4,3 # number of bytes of stack required
michael@0 60 # is at most numParams*8
michael@0 61 addi r3,r3,56 # linkage area (48) + this (8)
michael@0 62 mr r31,sp # save original stack top
michael@0 63 subfc sp,r3,sp # bump the stack
michael@0 64 addi r3,sp,56 # parameter pointer excludes linkage area
michael@0 65 # size + 'this'
michael@0 66
michael@0 67 bl .invoke_copy_to_stack
michael@0 68 nop
michael@0 69
michael@0 70 lfd f1,0(r31) # Restore floating point registers
michael@0 71 lfd f2,8(r31)
michael@0 72 lfd f3,16(r31)
michael@0 73 lfd f4,24(r31)
michael@0 74 lfd f5,32(r31)
michael@0 75 lfd f6,40(r31)
michael@0 76 lfd f7,48(r31)
michael@0 77 lfd f8,56(r31)
michael@0 78 lfd f9,64(r31)
michael@0 79 lfd f10,72(r31)
michael@0 80 lfd f11,80(r31)
michael@0 81 lfd f12,88(r31)
michael@0 82 lfd f13,96(r31)
michael@0 83
michael@0 84 ld r3,216(r31) # that (168+48)
michael@0 85 ld r4,0(r3) # get vTable from 'that'
michael@0 86 ld r5,224(r31) # methodIndex (168+56)
michael@0 87 sldi r5,r5,3 # methodIndex * 8
michael@0 88 # No junk at the start of 64bit vtable !!!
michael@0 89 ldx r11,r5,r4 # get function pointer (this jumps
michael@0 90 # either to the function if no adjustment
michael@0 91 # is needed (displacement = 0), or it
michael@0 92 # jumps to the thunk code, which will jump
michael@0 93 # to the function at the end)
michael@0 94
michael@0 95 # No adjustment of the that pointer in 64bit mode, this is done
michael@0 96 # by the thunk code
michael@0 97
michael@0 98 ld r4,56(sp)
michael@0 99 ld r5,64(sp)
michael@0 100 ld r6,72(sp)
michael@0 101 ld r7,80(sp)
michael@0 102 ld r8,88(sp)
michael@0 103 ld r9,96(sp)
michael@0 104 ld r10,104(sp)
michael@0 105
michael@0 106 bl ._ptrgl{PR}
michael@0 107 nop
michael@0 108
michael@0 109 mr sp,r31
michael@0 110 ld r0,184(sp) # 168+16
michael@0 111 addi sp,sp,168
michael@0 112 mtlr r0
michael@0 113 ld r31,-8(sp)
michael@0 114 blr
michael@0 115
michael@0 116 # .data section
michael@0 117
michael@0 118 .toc # 0x00000038
michael@0 119 T.18.NS_InvokeByIndex:
michael@0 120 .tc H.18.NS_InvokeByIndex{TC},NS_InvokeByIndex{DS}
michael@0 121
michael@0 122 .csect NS_InvokeByIndex{DS}
michael@0 123 .llong .NS_InvokeByIndex # "\0\0\0\0"
michael@0 124 .llong TOC{TC0} # "\0\0\0008"
michael@0 125 .llong 0x00000000 # "\0\0\0\0"
michael@0 126 # End csect NS_InvokeByIndex{DS}
michael@0 127
michael@0 128 # .bss section

mercurial