annotate dyncall/dyncall_callvm_ppc32.c @ 344:d60728b1f4a1

- tweaked html doc generation again so that it'll pick up dyncall.org's css file correctly (all in all not clean, see comment in source)
author Tassilo Philipp
date Tue, 07 Jan 2020 11:34:31 +0100
parents f5577f6bf97a
children ad5f9803f52f
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
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 184
diff changeset
9 Copyright (c) 2007-2018 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_call_ppc32.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 #include "dyncall_macros.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 #include "dyncall_types.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 #include "dyncall_utils.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 /* 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
52
184
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
53 #if defined(DC_UNIX)
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
54 # if defined(DC__OS_Darwin)
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
55 # define DC__ABI_Darwin
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
56 # else
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
57 # define DC__ABI_SysV
f44808587a3c - simplified some platform check
Tassilo Philipp
parents: 84
diff changeset
58 # endif
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 #else
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
60 # error Unsupported OS for ppc32 architecture.
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 static void dc_callvm_free_ppc32(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 dcFreeMem(in_self);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 static void dc_callvm_reset_ppc32(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 dcVecReset(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 self->mIntRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 self->mFloatRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 /* OS X/Darwin: fillup integer register file AND push on stack (for ellipsis) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 static void dc_callvm_argInt_ppc32_darwin(DCCallVM* in_self, DCint i)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 self->mRegData.mIntData[self->mIntRegs++] = i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 /* AND push onto stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 dcVecAppend(&self->mVecHead,&i,sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 static void dc_callvm_argInt_ppc32_sysv(DCCallVM* in_self, DCint i)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 self->mRegData.mIntData[self->mIntRegs++] = i;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 /* OR push onto stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 dcVecAppend(&self->mVecHead,&i,sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 /** floating-point **/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 /* double*/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 static void dc_callvm_argDouble_ppc32_darwin(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 if (self->mFloatRegs < 13) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 /* skip two integer register file entries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[0];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 self->mRegData.mIntData[self->mIntRegs++] = ( (DCint*) &d )[1];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 dcVecAppend(&self->mVecHead, &d, sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 #if 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 static void dc_callvm_argDouble_ppc32_sysv(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 < 8) {
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 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 static void dc_callvm_argDouble_ppc32_sysv(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 if (self->mFloatRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 else /* OR push data on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 /* align stack to 8 byte boundary */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7UL ) & -8UL );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 /* AND push data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 /* Floating-point */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 /* darwin:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 * - skip one integer register file entry (write in - for ellipsis calls)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 * sysv:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 * -
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 static void dc_callvm_argFloat_ppc32_darwin(DCCallVM* in_self, DCfloat f)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 if (self->mFloatRegs < 13) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f);
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 /* AND skip one integer register file entry (write in - for ellipsis calls) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 self->mRegData.mIntData[self->mIntRegs++] = *( (DCint*) &f );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 /* AND push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 static void dc_callvm_argFloat_ppc32_sysv(DCCallVM* in_self, DCfloat f)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 /* Put as float register (casted to double) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 if (self->mFloatRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 self->mRegData.mFloatData[self->mFloatRegs++] = (DCdouble) (f);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 else /* OR put float on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 dcVecAppend(&self->mVecHead, &f, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 /* long long integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 static void dc_callvm_argLongLong_ppc32_darwin(DCCallVM* in_self, DClonglong L)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 DCint* p = (DCint*) &L;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 dcArgInt(in_self, p[0]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 dcArgInt(in_self, p[1]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 static void dc_callvm_argLongLong_ppc32_sysv(DCCallVM* in_self, DClonglong L)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 DCint* p = (DCint*) &L;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 if (self->mIntRegs < 7)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 /* next free integer register is even (r0, r2, r3) ? */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 /* if not, skip one integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 if (self->mIntRegs & 1) self->mIntRegs++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 self->mRegData.mIntData[self->mIntRegs++] = p[0];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 self->mRegData.mIntData[self->mIntRegs++] = p[1];
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 /* OR push onto stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 /* in case, mIntRegs == 7, set it to 8 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 self->mIntRegs = 8;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 /* align stack to 8 byte boundary */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 dcVecResize(&self->mVecHead , ( dcVecSize(&self->mVecHead) + 7 ) & (-8UL) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 /* push data */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 static void dc_callvm_argBool_ppc32(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 dcArgInt(in_self, (x == 0) ? DC_FALSE : DC_TRUE );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 static void dc_callvm_argChar_ppc32(DCCallVM* in_self, DCchar ch)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 dcArgInt(in_self, (DCint) ch );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 }
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 static void dc_callvm_argShort_ppc32(DCCallVM* in_self, DCshort s)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 dcArgInt(in_self, (DCint) s );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244 static void dc_callvm_argLong_ppc32(DCCallVM* in_self, DClong l)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
245 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247 dcArgInt(in_self, (DCint) l );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 static void dc_callvm_argPointer_ppc32(DCCallVM* in_self, DCpointer p)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252 /* promote to integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253 dcArgInt(in_self, *(DCint*) &p );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 void dc_callvm_call_ppc32_darwin(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260 dcCall_ppc32_darwin(
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 target,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262 &self->mRegData,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263 DC_MAX(dcVecSize(&self->mVecHead), 8*4),
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 dcVecData(&self->mVecHead)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265 );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
266 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
267
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
268 void dc_callvm_call_ppc32_sysv(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
269 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
270 DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
271 dcCall_ppc32_sysv( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 void dc_callvm_call_ppc32_syscall(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276 DCCallVM_ppc32* self = (DCCallVM_ppc32*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277 dcCall_ppc32_syscall( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 DCCallVM_vt gVT_ppc32_darwin =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 &dc_callvm_free_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 , &dc_callvm_reset_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
286 , &dc_callvm_mode_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287 , &dc_callvm_argBool_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288 , &dc_callvm_argChar_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289 , &dc_callvm_argShort_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290 , &dc_callvm_argInt_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 , &dc_callvm_argLong_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292 , &dc_callvm_argLongLong_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
293 , &dc_callvm_argFloat_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
294 , &dc_callvm_argDouble_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
295 , &dc_callvm_argPointer_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
296 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
297 , (DCvoidvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
298 , (DCboolvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
299 , (DCcharvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
300 , (DCshortvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
301 , (DCintvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
302 , (DClongvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
303 , (DClonglongvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
304 , (DCfloatvmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
305 , (DCdoublevmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
306 , (DCpointervmfunc*) &dc_callvm_call_ppc32_darwin
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
307 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
308 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
309
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
310 DCCallVM_vt gVT_ppc32_sysv =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
311 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
312 &dc_callvm_free_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
313 , &dc_callvm_reset_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
314 , &dc_callvm_mode_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
315 , &dc_callvm_argBool_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
316 , &dc_callvm_argChar_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
317 , &dc_callvm_argShort_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
318 , &dc_callvm_argInt_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
319 , &dc_callvm_argLong_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
320 , &dc_callvm_argLongLong_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
321 , &dc_callvm_argFloat_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
322 , &dc_callvm_argDouble_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
323 , &dc_callvm_argPointer_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
324 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
325 , (DCvoidvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
326 , (DCboolvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
327 , (DCcharvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
328 , (DCshortvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
329 , (DCintvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
330 , (DClongvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
331 , (DClonglongvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
332 , (DCfloatvmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
333 , (DCdoublevmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
334 , (DCpointervmfunc*) &dc_callvm_call_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
335 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
336 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
337
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
338 DCCallVM_vt gVT_ppc32_syscall =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
339 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
340 &dc_callvm_free_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
341 , &dc_callvm_reset_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
342 , &dc_callvm_mode_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
343 , &dc_callvm_argBool_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
344 , &dc_callvm_argChar_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
345 , &dc_callvm_argShort_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
346 , &dc_callvm_argInt_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
347 , &dc_callvm_argLong_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
348 , &dc_callvm_argLongLong_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
349 , &dc_callvm_argFloat_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
350 , &dc_callvm_argDouble_ppc32_sysv
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
351 , &dc_callvm_argPointer_ppc32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
352 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
353 , (DCvoidvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
354 , (DCboolvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
355 , (DCcharvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
356 , (DCshortvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
357 , (DCintvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
358 , (DClongvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
359 , (DClonglongvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
360 , (DCfloatvmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
361 , (DCdoublevmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
362 , (DCpointervmfunc*) &dc_callvm_call_ppc32_syscall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
363 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
364 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
365
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
366
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
367 void dc_callvm_mode_ppc32(DCCallVM* in_self, DCint mode)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
368 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
369 DCCallVM_ppc32* self = (DCCallVM_ppc32*)in_self;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
370 DCCallVM_vt* vt;
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
371
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
372 switch(mode) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
373
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
374 #if defined(DC__ABI_Darwin)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
375 case DC_CALL_C_DEFAULT:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
376 case DC_CALL_C_ELLIPSIS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
377 case DC_CALL_C_ELLIPSIS_VARARGS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
378 #endif
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
379 case DC_CALL_C_PPC32_OSX:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
380 vt = &gVT_ppc32_darwin;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
381 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
382
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
383 #if defined(DC__ABI_SysV)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
384 case DC_CALL_C_DEFAULT:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
385 case DC_CALL_C_ELLIPSIS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
386 case DC_CALL_C_ELLIPSIS_VARARGS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
387 #endif
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
388 case DC_CALL_C_PPC32_SYSV:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
389 vt = &gVT_ppc32_sysv;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
390 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
391
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
392 case DC_CALL_SYS_DEFAULT:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
393 case DC_CALL_SYS_PPC32:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
394 vt = &gVT_ppc32_syscall;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
395 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
396
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
397 default:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
398 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
399 return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
400 }
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
401
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
402 dc_callvm_base_init(&self->mInterface, vt);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
403 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
404
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
405 /* Public API. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
406 DCCallVM* dcNewCallVM(DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
407 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
408 DCCallVM_ppc32* p = (DCCallVM_ppc32*)dcAllocMem(sizeof(DCCallVM_ppc32)+size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
409
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
410 dc_callvm_mode_ppc32((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
411
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
412 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
413 dc_callvm_reset_ppc32((DCCallVM*)p);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
414
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
415 return (DCCallVM*)p;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
416 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
417