annotate dyncall/dyncall_callvm_ppc32.c @ 457:90b1d927912a

- suite_aggrs: make sure random memory used doesn't ever result in NaN fp values (for every possible address), as this messes with result comparison
author Tassilo Philipp
date Fri, 28 Jan 2022 14:11:21 +0100
parents ad5f9803f52f
children ddfb9577a00e
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_callvm_ppc32.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description:
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
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
9 Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
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
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 dyncall callvm for ppc32 architectures
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 SUPPORTED CALLING CONVENTIONS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 ppc32/osx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 ppc32/linux (sysv abi)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 ppc32/syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 REVISION
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 2015/01/15 added syscall (tested on Linux)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 2009/01/09 added System V ABI support
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 2007/12/11 initial support for Darwin ABI
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 #include "dyncall_callvm_ppc32.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 #include "dyncall_macros.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 #include "dyncall_types.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 #include "dyncall_utils.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
50
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
51 /*
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
52 ** PowerPC 32-bit calling convention call
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
53 **
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
54 ** - hybrid return-type call (bool ... pointer)
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
55 **
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
56 */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
57
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
58 /* Darwin ABI */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
59 void dcCall_ppc32_darwin(DCpointer target, DCRegData_ppc32* ppc32data, DCsize stksize, DCpointer stkdata);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
60
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
61 /* System V ABI */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
62 void dcCall_ppc32_sysv(DCpointer target, DCRegData_ppc32* ppc32data, DCsize stksize, DCpointer stkdata);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
63
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
64 /* syscall @@@ Bus Error on Darwin */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
65 void dcCall_ppc32_syscall(DCpointer target, DCRegData_ppc32* ppc32data, DCsize stksize, DCpointer stkdata);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 /* Support for Mac OS X (Darwin) and Systen V ABI for Power PC 32-bit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
68
184
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
69 #if defined(DC_UNIX)
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
70 # if defined(DC__OS_Darwin)
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
71 # define DC__ABI_Darwin
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
72 # else
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
73 # define DC__ABI_SysV
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
74 # endif
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 #else
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
76 # error Unsupported OS for ppc32 architecture.
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 static void dc_callvm_free_ppc32(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 dcFreeMem(in_self);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 static void dc_callvm_reset_ppc32(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 dcVecReset(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 self->mIntRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 self->mFloatRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 /* OS X/Darwin: fillup integer register file AND push on stack (for ellipsis) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 static void dc_callvm_argInt_ppc32_darwin(DCCallVM* in_self, DCint i)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 self->mRegData.mIntData[self->mIntRegs++] = i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 /* AND push onto stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 dcVecAppend(&self->mVecHead,&i,sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 static void dc_callvm_argInt_ppc32_sysv(DCCallVM* in_self, DCint i)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 self->mRegData.mIntData[self->mIntRegs++] = i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 /* OR push onto stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 dcVecAppend(&self->mVecHead,&i,sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 /** floating-point **/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 /* double*/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 static void dc_callvm_argDouble_ppc32_darwin(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 if (self->mFloatRegs < 13) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 /* skip two integer register file entries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 #if 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 if (self->mFloatRegs < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 /* skip two integer register file entries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 if (self->mFloatRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 else /* OR push data on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 /* align stack to 8 byte boundary */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7UL ) & -8UL );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 /* AND push data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 /* Floating-point */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 /* darwin:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 * - skip one integer register file entry (write in - for ellipsis calls)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 * sysv:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 * -
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 static void dc_callvm_argFloat_ppc32_darwin(DCCallVM* in_self, DCfloat f)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 if (self->mFloatRegs < 13) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 /* AND skip one integer register file entry (write in - for ellipsis calls) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 self->mRegData.mIntData[self->mIntRegs++] = *( (DCint*) &f );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 /* AND push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 static void dc_callvm_argFloat_ppc32_sysv(DCCallVM* in_self, DCfloat f)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 /* Put as float register (casted to double) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 if (self->mFloatRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 else /* OR put float on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 /* long long integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 static void dc_callvm_argLongLong_ppc32_darwin(DCCallVM* in_self, DClonglong L)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 DCint* p = (DCint*) &L;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 dcArgInt(in_self, p[0]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 dcArgInt(in_self, p[1]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 static void dc_callvm_argLongLong_ppc32_sysv(DCCallVM* in_self, DClonglong L)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 DCint* p = (DCint*) &L;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 if (self->mIntRegs < 7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 /* next free integer register is even (r0, r2, r3) ? */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 /* if not, skip one integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 if (self->mIntRegs & 1) self->mIntRegs++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 self->mRegData.mIntData[self->mIntRegs++] = p[0];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 self->mRegData.mIntData[self->mIntRegs++] = p[1];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 /* OR push onto stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 /* in case, mIntRegs == 7, set it to 8 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 self->mIntRegs = 8;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 /* align stack to 8 byte boundary */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7 ) & (-8UL) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 /* push data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239 static void dc_callvm_argBool_ppc32(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 dcArgInt(in_self, (x == 0) ? DC_FALSE : DC_TRUE );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
245
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 static void dc_callvm_argChar_ppc32(DCCallVM* in_self, DCchar ch)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249 dcArgInt(in_self, (DCint) ch );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253 static void dc_callvm_argShort_ppc32(DCCallVM* in_self, DCshort s)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256 dcArgInt(in_self, (DCint) s );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260 static void dc_callvm_argLong_ppc32(DCCallVM* in_self, DClong l)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263 dcArgInt(in_self, (DCint) l );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
266 static void dc_callvm_argPointer_ppc32(DCCallVM* in_self, DCpointer p)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
267 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
268 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
269 dcArgInt(in_self, *(DCint*) &p );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
270 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
271
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273 void dc_callvm_call_ppc32_darwin(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276 dcCall_ppc32_darwin(
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277 target,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278 &self->mRegData,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279 DC_MAX(dcVecSize(&self->mVecHead), 8*4),
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 dcVecData(&self->mVecHead)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281 );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 void dc_callvm_call_ppc32_sysv(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
286 DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287 dcCall_ppc32_sysv( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290 void dc_callvm_call_ppc32_syscall(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292 DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
293 dcCall_ppc32_syscall( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
294 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
295
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
296 void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
297
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
298 DCCallVM_vt gVT_ppc32_darwin =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
299 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
300 &dc_callvm_free_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
301 , &dc_callvm_reset_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
302 , &dc_callvm_mode_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
303 , &dc_callvm_argBool_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
304 , &dc_callvm_argChar_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
305 , &dc_callvm_argShort_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
306 , &dc_callvm_argInt_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
307 , &dc_callvm_argLong_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
308 , &dc_callvm_argLongLong_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
309 , &dc_callvm_argFloat_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
310 , &dc_callvm_argDouble_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
311 , &dc_callvm_argPointer_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
312 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
313 , (DCvoidvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
314 , (DCboolvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
315 , (DCcharvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
316 , (DCshortvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
317 , (DCintvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
318 , (DClongvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
319 , (DClonglongvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
320 , (DCfloatvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
321 , (DCdoublevmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
322 , (DCpointervmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
323 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
324 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
325
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
326 DCCallVM_vt gVT_ppc32_sysv =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
327 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
328 &dc_callvm_free_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
329 , &dc_callvm_reset_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
330 , &dc_callvm_mode_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
331 , &dc_callvm_argBool_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
332 , &dc_callvm_argChar_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
333 , &dc_callvm_argShort_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
334 , &dc_callvm_argInt_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
335 , &dc_callvm_argLong_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
336 , &dc_callvm_argLongLong_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
337 , &dc_callvm_argFloat_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
338 , &dc_callvm_argDouble_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
339 , &dc_callvm_argPointer_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
340 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
341 , (DCvoidvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
342 , (DCboolvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
343 , (DCcharvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
344 , (DCshortvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
345 , (DCintvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
346 , (DClongvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
347 , (DClonglongvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
348 , (DCfloatvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
349 , (DCdoublevmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
350 , (DCpointervmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
351 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
352 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
353
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
354 DCCallVM_vt gVT_ppc32_syscall =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
355 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
356 &dc_callvm_free_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
357 , &dc_callvm_reset_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
358 , &dc_callvm_mode_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
359 , &dc_callvm_argBool_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
360 , &dc_callvm_argChar_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
361 , &dc_callvm_argShort_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
362 , &dc_callvm_argInt_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
363 , &dc_callvm_argLong_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
364 , &dc_callvm_argLongLong_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
365 , &dc_callvm_argFloat_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
366 , &dc_callvm_argDouble_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
367 , &dc_callvm_argPointer_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
368 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
369 , (DCvoidvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
370 , (DCboolvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
371 , (DCcharvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
372 , (DCshortvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
373 , (DCintvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
374 , (DClongvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
375 , (DClonglongvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
376 , (DCfloatvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
377 , (DCdoublevmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
378 , (DCpointervmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
379 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
380 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
381
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
382
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
383 void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
384 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
385 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
386 DCCallVM_vt* vt;
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
387
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
388 switch(mode) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
389
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
390 #if defined(DC__ABI_Darwin)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
391 case DC_CALL_C_DEFAULT:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
392 case DC_CALL_C_ELLIPSIS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
393 case DC_CALL_C_ELLIPSIS_VARARGS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
394 #endif
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
395 case DC_CALL_C_PPC32_OSX:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
396 vt = &gVT_ppc32_darwin;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
397 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
398
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
399 #if defined(DC__ABI_SysV)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
400 case DC_CALL_C_DEFAULT:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
401 case DC_CALL_C_ELLIPSIS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
402 case DC_CALL_C_ELLIPSIS_VARARGS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
403 #endif
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
404 case DC_CALL_C_PPC32_SYSV:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
405 vt = &gVT_ppc32_sysv;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
406 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
407
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
408 case DC_CALL_SYS_DEFAULT:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
409 case DC_CALL_SYS_PPC32:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
410 vt = &gVT_ppc32_syscall;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
411 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
412
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
413 default:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
414 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
415 return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
416 }
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
417
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
418 dc_callvm_base_init(&self->mInterface, vt);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
419 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
420
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
421 /* Public API. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
422 DCCallVM* dcNewCallVM(DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
423 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
424 DCCallVM_ppc32* p = (DCCallVM_ppc32*)dcAllocMem(sizeof(DCCallVM_ppc32)+size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
425
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
426 dc_callvm_mode_ppc32((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
427
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
428 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
429 dc_callvm_reset_ppc32((DCCallVM*)p);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
430
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
431 return (DCCallVM*)p;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
432 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
433