annotate dyncallback/dyncall_callback_ppc64.S @ 240:891e8ba15862

- replaced character constants in ppc assembly files with their values for compatibility with older toolchains
author Tassilo Philipp
date Tue, 02 May 2017 03:29:47 +0200
parents 7ca57dbefed4
children d982a00c2177
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: dyncallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncallback/dyncall_callback_ppc64.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Callback Thunk - Implementation for PowerPC 64-bit
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
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
25 #include "../portasm/portasm-ppc64.S"
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
27 .text
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
28 .align 2
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 /* struct DCCallback */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
31
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
32 #if DC__ABI_PPC64_ELF_V != 2
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
33 DCB_THUNK = 0 /* v1 */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
34 DCB_HANDLER = 64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
35 DCB_STACKCLEAN = 72
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
36 DCB_USERDATA = 80
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
37 #else
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
38 DCB_THUNK = 0 /* v2 */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 DCB_HANDLER = 48
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 DCB_STACKCLEAN = 56
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 DCB_USERDATA = 64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 /* struct DCArgs */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
45
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
46 ARGS_IREGS = 0
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
47 ARGS_FREGS = ARGS_IREGS + 8*8
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
48 ARGS_SP = ARGS_FREGS + 8*13
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
49 ARGS_ICNT = ARGS_SP + 8
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
50 ARGS_FCNT = ARGS_ICNT + 4
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
51 ARGS_SIZE = ARGS_FCNT + 4
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 /* struct DCValue */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
54
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
55 RESULT_SIZE = 8
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
56
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
57 /* Stack Offsets */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
59 SP_PREV = 0
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
60 SP_CR = SP_PREV + 8
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
61 SP_LR = SP_CR + 8
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
62 #if DC__ABI_PPC64_ELF_V != 2
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
63 SP_TOC = 40
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
64 SP_PAR = 48
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
65 PAR_SZ = 64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
66 #else
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
67 SP_TOC = 24
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
68 SP_PAR = 32
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
69 PAR_SZ = 0
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
70 #endif
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
71 SP_ARGS = SP_PAR + PAR_SZ
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
72 SP_IREGS = SP_ARGS + ARGS_IREGS
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
73 SP_FREGS = SP_ARGS + ARGS_FREGS
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
74 SP_SP = SP_ARGS + ARGS_SP
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
75 SP_ICNT = SP_ARGS + ARGS_ICNT
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
76 SP_FCNT = SP_ARGS + ARGS_FCNT
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
77 SP_RESULT = SP_ARGS + ARGS_SIZE
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
78 SP_LOCAL = SP_RESULT + RESULT_SIZE /* additional locals (reg 30/31) */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
79 SP_SIZE = SP_LOCAL + 2*8
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
81 #define ALIGN(M,X) ( M+(X-1) & (-X) )
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
82
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
83 FRAMESIZE = ALIGN(SP_SIZE,16)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
84
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
85 GLOBAL_C(dcCallbackThunkEntry)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
86 ENTRY_C(dcCallbackThunkEntry)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
87
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
88 /* --------------------------------------------------------------------------
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
89
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
90 Input:
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
91 r1 Stack Pointer
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
92 r3-r10 Integer Arguments
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
93 f1-f8 Floating-point Arguments
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
94 r11 Thunk Pointer
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
95
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 mflr r0
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
99 std r0, SP_LR(r1) /* store return address */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
100 std r31, -8(r1) /* store preserved registers (r31) */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
101 addi r12, r1, SP_PAR /* temporary r12 = parameter area on callers stack frame */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
102 stdu r1, -FRAMESIZE(r1) /* save callers stack pointer and make new stack frame. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
104 std r3, SP_IREGS + 0*8(r1) /* spill 8 integer parameter registers */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
105 std r4, SP_IREGS + 1*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
106 std r5, SP_IREGS + 2*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
107 std r6, SP_IREGS + 3*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
108 std r7, SP_IREGS + 4*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
109 std r8, SP_IREGS + 5*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
110 std r9, SP_IREGS + 6*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
111 std r10,SP_IREGS + 7*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
112 stfd f1, SP_FREGS + 0*8(r1) /* spill 13 float parameter registers */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
113 stfd f2, SP_FREGS + 1*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
114 stfd f3, SP_FREGS + 2*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
115 stfd f4, SP_FREGS + 3*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
116 stfd f5, SP_FREGS + 4*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
117 stfd f6, SP_FREGS + 5*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
118 stfd f7, SP_FREGS + 6*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
119 stfd f8, SP_FREGS + 7*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
120 stfd f9, SP_FREGS + 8*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
121 stfd f10,SP_FREGS + 9*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
122 stfd f11,SP_FREGS +10*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
123 stfd f12,SP_FREGS +11*8(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
124 stfd f13,SP_FREGS +12*8(r1)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 /* initialize struct DCCallback */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
126 std r12,SP_SP(r1) /* init stack pointer */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 xor r0, r0, r0 /* init register counters */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
128 std r0, SP_ICNT(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
129 std r0, SP_FCNT(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
130 std r0, SP_RESULT(r1) /* init result object */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 /* invoke callback handler */
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
132 mr r3, r11 /* arg 1: DCCallback* pcb (r11 is thunk pointer) */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
133 addi r4, r1, SP_ARGS /* arg 2: DCArgs* args */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
134 addi r5, r1, SP_RESULT /* arg 3: DCValue* result */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 ld r6, DCB_USERDATA(r11) /* arg 4: void* userdata */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 /* branch-and-link to DCCallback.handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 ld r12, DCB_HANDLER(r11)
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
139 std r2, SP_TOC(r1)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 #if DC__ABI_PPC64_ELF_V != 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 ld r2, 8(r12)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 ld r0, 0(r12)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 mtctr r0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 mtctr r12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 bctrl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
149 /* check result type */
240
891e8ba15862 - replaced character constants in ppc assembly files with their values for compatibility with older toolchains
Tassilo Philipp
parents: 7
diff changeset
150 cmpi cr0, r3, 0x66 /* 'f */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 beq .f32
240
891e8ba15862 - replaced character constants in ppc assembly files with their values for compatibility with older toolchains
Tassilo Philipp
parents: 7
diff changeset
152 cmpi cr0, r3, 0x64 /* 'd */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 beq .f64
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
154 .i64:
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
155 ld r3, SP_RESULT(r1)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 b .end
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 .end:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
159 ld r2, SP_TOC(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
160 ld r1, SP_PREV(r1) /* restore stack pointer */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
161 ld r31, -8(r1) /* restore preserved registers */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
162 ld r0, SP_LR(r1) /* load link register with return address */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 mtlr r0
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
164 blr /* branch back to link register */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
165 .f32:
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
166 lfs f1, SP_RESULT(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
167 b .end
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
168 .f64:
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
169 lfd f1, SP_RESULT(r1)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
170 b .end