annotate dyncall/dyncall_call_ppc64.S @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children 7ca57dbefed4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_call_ppc64.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Call Kernel for PowerPC 64-bit Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2014-2015 Masanori Mitsugi <mitsugi@linux.vnet.ibm.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 #include "../portasm/portasm-ppc.S"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 Call Kernel Implementations for PowerPC64.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 /* ============================================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 DynCall Call Kernels for PPC64 Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 -------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 struct DCRegData { int i[8]; double d[13]; };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 dcCall_ppc64(DCpointer target, struct DCRegData* pRegData, DCsize stacksize, DCptr stackdata);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 ChangeLog:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 2014-08-07: Initial Support
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 /* ----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 Call Kernel for ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 Input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 r3 : target address ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 r4 : register data ptr (8 x GPR 64 bytes, 13 x FPR 64 bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 r5 : stack data size
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 r6 : stack data ptr
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 - Stack frames are always aligned on 16 byte
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 - Reserve GPR2 (System register)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 - The GPR3 .. GPR10 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 - The FPR1 .. FPR8 are loaded
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 - No support for Vector Parameters so far.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 - Parameter Area (min. v1:64 Bytes v2:0 Byte)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 - Frame Header Area (v1:48 Bytes v2:32 Bytes)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 Frame structure:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 on entry, parent frame layout:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 offset
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 16: LR save word (Callee stores LR in parent frame)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 0: parent stack frame (back-chain)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 after frame initialization:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 v1: stack size = ( (48+64+8+15) + stacksize ) & -(16)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 v2: stack size = ( (32+0+8+15) + stacksize ) & -(16)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 ... locals and register spills
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 48 or 32: parameter list area
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 16: LR save word (Callee stores LR in parent frame)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 0: parent stack frame (back-chain)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 /* Constants */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 STACK_MIN = 120 /* v1 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 TOC_SAVE = 40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 PARAM_SAVE = 48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 STACK_MIN = 40 /* v2 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 TOC_SAVE = 24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 PARAM_SAVE = 32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 .global dcCall_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 .type dcCall_ppc64, @function
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 .section .opd, "aw"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 .align 3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 dcCall_ppc64:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 .quad .dcCall_ppc64, .TOC.@tocbase, 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 .previous
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 .global .dcCall_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 .dcCall_ppc64:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 0: addis r2, r12,.TOC.-0b@ha
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 addi r2, r2,.TOC.-0b@l
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 .localentry dcCall_ppc64,.-dcCall_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 mflr r0 /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 std r0,16(r1) /* store r0 to link-area */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 std r31,-8(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 /* compute aligned stack-size */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 /* add link area and align to 16 byte (+15) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 /* r0 = stacksize + frame parameter(back-chain link, this callee's call return address) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 addi r0,r5,STACK_MIN+15 /* r0 = r5 + STACK_MIN + 15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 rlwinm r0,r0,0,0,27 /* r0 = r0 and -15 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 neg r0,r0 /* r0 = -r0 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 stdux r1,r1,r0 /* store r1 and decrement */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 /* copy stack data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 subi r6,r6,8 /* r6 = 8 bytes before source stack ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 addi r7,r1,PARAM_SAVE-8 /* r7 = 8 bytes before target stack parameter-block */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 srwi r5,r5,3 /* r5 = size in double words */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 cmpi cr0,r5,0 /* if stacksize != 0 .. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 beq cr0,.copy_done
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 mtctr r5 /* copy loop */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 .copy_next:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 ldu r0, 8(r6)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 stdu r0, 8(r7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 bdnz .copy_next
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 .copy_done:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 /* this call support using ctr branch register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 mr r12, r3 /* r12 = target function */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 std r2,TOC_SAVE(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 ld r2,8(r12)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 ld r0,0(r12)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 mtctr r0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 mtctr r12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 mr r11, r4 /* r11 = reg data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 /* load 8 integer registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 ld r3 , 0(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 ld r4 , 8(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 ld r5 ,16(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 ld r6 ,24(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 ld r7 ,32(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 ld r8 ,40(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 ld r9 ,48(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 ld r10,56(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 /* load 13 float registers */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 lfd f1 , 64(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 lfd f2 , 72(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 lfd f3 , 80(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 lfd f4 , 88(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 lfd f5 , 96(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 lfd f6 ,104(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 lfd f7 ,112(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 lfd f8 ,120(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 lfd f9 ,128(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 lfd f10,136(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 lfd f11,144(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 lfd f12,152(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 lfd f13,160(r11)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 bctrl /* branch with this call support */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 /* epilog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 ld r2,TOC_SAVE(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 ld r1, 0(r1) /* restore stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 ld r31,-8(r1)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 ld r0,16(r1) /* r0 = return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 mtlr r0 /* setup link register */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 blr /* return */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197