annotate dyncallback/dyncall_callback_ppc64.S @ 357:d982a00c2177

- PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
author Tassilo Philipp
date Tue, 25 Feb 2020 18:16:13 +0100
parents 891e8ba15862
children
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 */
357
d982a00c2177 - PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
Tassilo Philipp
parents: 240
diff changeset
150 cmpi cr0, 0, r3, 0x66 /* 'f */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 beq .f32
357
d982a00c2177 - PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
Tassilo Philipp
parents: 240
diff changeset
152 cmpi cr0, 0, 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