annotate dyncall/dyncall_callvm_ppc64.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_ppc64.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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2014-2015 Masanori Mitsugi <mitsugi@linux.vnet.ibm.com>
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
10 2020 Tassilo Philipp <tphilipp@potion-studios.com>
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
11
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
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 ppc64 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 ppc64/linux
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
34 ppc64/syscall
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 REVISION
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
37 2015/07/08 added syscall
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 2014/08/07 initial support
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 #include "dyncall_callvm_ppc64.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 #include "dyncall_macros.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 #include "dyncall_types.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
47
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
48 /*
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
49 ** PowerPC 64-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: 84
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: 84
diff changeset
51 ** - 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: 84
diff changeset
52 **
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
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: 84
diff changeset
54
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
55 void dcCall_ppc64(DCpointer target, DCRegData_ppc64* ppc64data, 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: 84
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: 84
diff changeset
57 /* syscall */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
diff changeset
58 void dcCall_ppc64_syscall(DCpointer target, DCRegData_ppc64* ppc64data, 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: 84
diff changeset
59
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 84
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: 84
diff changeset
61
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 /* Support for Power PC 64-bit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 static void dc_callvm_free_ppc64(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 dcFreeMem(in_self);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 static void dc_callvm_reset_ppc64(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 dcVecReset(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 self->mIntRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 self->mFloatRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 /* fillup integer register file AND push on stack (for ellipsis) */
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_argInt_ppc64(DCCallVM* in_self, DCint i)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 /* promote to longlong */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 dcArgLongLong(in_self, (DClonglong)i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 /** floating-point **/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 /* double*/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 static void dc_callvm_argDouble_ppc64(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
93 if (self->mFloatRegs < 13) {
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 if (self->mIntRegs < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 self->mRegData.mIntData[self->mIntRegs++] = *( (DClonglong*) &d );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 }
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
101 }
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 if (dcVecSize(&self->mVecHead) == 0) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 dcVecSkip(&self->mVecHead,sizeof(DClonglong)*8);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 static void dc_callvm_argDouble_ppc64_ellipsis(DCCallVM* in_self, DCdouble d)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
118 if (dcVecSize(&self->mVecHead) == 0)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 dcVecSkip(&self->mVecHead,(sizeof(DClonglong))*(self->mIntRegs));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
121 if (self->mFloatRegs < 13) {
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 self->mRegData.mFloatData[self->mFloatRegs++] = d;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 if (self->mIntRegs < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 self->mRegData.mIntData[self->mIntRegs++] = *( (DClonglong*) &d );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 dcVecAppend(&self->mVecHead,(DCpointer) &d,sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 #endif
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 /* Floating-point */
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
135
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 static void dc_callvm_argFloat_ppc64(DCCallVM* in_self, DCfloat f)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 {
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
138 DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
139
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
140 DCdouble d;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
141 #if defined(DC__Endian_BIG)
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
142 struct { DCfloat f_pad; DCfloat f; } sf;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
143 #else /* Endian_LITTLE */
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
144 struct { DCfloat f; DCfloat f_pad; } sf;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
145 #endif
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
146
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
147 if (self->mFloatRegs < 13) {
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
148 d = (DCdouble)f;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
149 self->mRegData.mFloatData[self->mFloatRegs++] = d;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
150 if (self->mIntRegs < 8) {
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
151 self->mRegData.mIntData[self->mIntRegs++] = *( (DClonglong*) &d );
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
152 #if DC__ABI_PPC64_ELF_V == 2
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
153 return;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
154 #endif
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
155 }
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
156 }
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
157
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
158 #if DC__ABI_PPC64_ELF_V == 2
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
159 if (dcVecSize(&self->mVecHead) == 0) {
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
160 dcVecSkip(&self->mVecHead,sizeof(DClonglong)*8);
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
161 }
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
162 #endif
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
163
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
164 /* push on stack */
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
165 sf.f = f;
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
166 dcVecAppend(&self->mVecHead,(DCpointer) &sf,sizeof(DCdouble));
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
167 }
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
168
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
169 #if DC__ABI_PPC64_ELF_V == 2
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
170 static void dc_callvm_argFloat_ppc64_ellipsis(DCCallVM* in_self, DCfloat f)
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
171 {
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 /* promote to double */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 dcArgDouble(in_self, (DCdouble) f );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 }
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
175 #endif
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
176
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 /* long long integer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 static void dc_callvm_argLongLong_ppc64(DCCallVM* in_self, DClonglong L)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self;
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
183
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 /* fillup integer register file */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 if (self->mIntRegs < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 self->mRegData.mIntData[self->mIntRegs++] = L;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 if (dcVecSize(&self->mVecHead) == 0) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 dcVecSkip(&self->mVecHead,sizeof(DClonglong)*8);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 static void dc_callvm_argLongLong_ppc64_ellipsis(DCCallVM* in_self, DClonglong L)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 DCCallVM_ppc64* self = (DCCallVM_ppc64*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 if (dcVecSize(&self->mVecHead) == 0)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 dcVecSkip(&self->mVecHead,(sizeof(DClonglong))*(self->mIntRegs));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 if (self->mIntRegs < 8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 self->mRegData.mIntData[self->mIntRegs++] = L;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 /* push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 dcVecAppend(&self->mVecHead,&L,sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 static void dc_callvm_argBool_ppc64(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 /* promote to longlong */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 dcArgLongLong(in_self, (DClonglong) x );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 static void dc_callvm_argChar_ppc64(DCCallVM* in_self, DCchar ch)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 /* promote to longlong */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 dcArgLongLong(in_self, (DClonglong) ch );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 static void dc_callvm_argShort_ppc64(DCCallVM* in_self, DCshort s)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 /* promote to longlong */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236 dcArgLongLong(in_self, (DClonglong) s );
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240 static void dc_callvm_argLong_ppc64(DCCallVM* in_self, DClong l)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 /* promote to longlong */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243 dcArgLongLong(in_self, (DClonglong) l );
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247 static void dc_callvm_argPointer_ppc64(DCCallVM* in_self, DCpointer p)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249 /* promote to longlong */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 dcArgLongLong(in_self, *(DClonglong *) &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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 void dc_callvm_call_ppc64(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256 DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 int size = dcVecSize(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259 if (size < 64) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260 dcVecSkip(&self->mVecHead, 64-size);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263 dcCall_ppc64( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
266 void dc_callvm_call_ppc64_syscall(DCCallVM* in_self, DCpointer target)
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
267 {
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
268 DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self;
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
269 dcCall_ppc64_syscall( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
270 }
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
271
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272 void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 DCCallVM_vt gVT_ppc64 =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276 &dc_callvm_free_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277 , &dc_callvm_reset_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278 , &dc_callvm_mode_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279 , &dc_callvm_argBool_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 , &dc_callvm_argChar_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281 , &dc_callvm_argShort_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 , &dc_callvm_argInt_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283 , &dc_callvm_argLong_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 , &dc_callvm_argLongLong_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 , &dc_callvm_argFloat_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
286 , &dc_callvm_argDouble_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287 , &dc_callvm_argPointer_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289 , (DCvoidvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290 , (DCboolvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 , (DCcharvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292 , (DCshortvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
293 , (DCintvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
294 , (DClongvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
295 , (DClonglongvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
296 , (DCfloatvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
297 , (DCdoublevmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
298 , (DCpointervmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
299 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
300 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
301
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
302 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
303 DCCallVM_vt gVT_ppc64_ellipsis =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
304 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
305 &dc_callvm_free_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
306 , &dc_callvm_reset_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
307 , &dc_callvm_mode_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
308 , &dc_callvm_argBool_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
309 , &dc_callvm_argChar_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
310 , &dc_callvm_argShort_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
311 , &dc_callvm_argInt_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
312 , &dc_callvm_argLong_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
313 , &dc_callvm_argLongLong_ppc64_ellipsis
83
54930a037e8a - PPC64 single-precision float fixes for more than 13 float args (thanks Masanori!)
cslag
parents: 7
diff changeset
314 , &dc_callvm_argFloat_ppc64_ellipsis
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
315 , &dc_callvm_argDouble_ppc64_ellipsis
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
316 , &dc_callvm_argPointer_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
317 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
318 , (DCvoidvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
319 , (DCboolvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
320 , (DCcharvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
321 , (DCshortvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
322 , (DCintvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
323 , (DClongvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
324 , (DClonglongvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
325 , (DCfloatvmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
326 , (DCdoublevmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
327 , (DCpointervmfunc*) &dc_callvm_call_ppc64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
328 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
329 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
330 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
331
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
332 DCCallVM_vt gVT_ppc64_syscall =
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
333 {
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
334 &dc_callvm_free_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
335 , &dc_callvm_reset_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
336 , &dc_callvm_mode_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
337 , &dc_callvm_argBool_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
338 , &dc_callvm_argChar_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
339 , &dc_callvm_argShort_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
340 , &dc_callvm_argInt_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
341 , &dc_callvm_argLong_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
342 , &dc_callvm_argLongLong_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
343 , &dc_callvm_argFloat_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
344 , &dc_callvm_argDouble_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
345 , &dc_callvm_argPointer_ppc64
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
346 , NULL /* argStruct */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
347 , (DCvoidvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
348 , (DCboolvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
349 , (DCcharvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
350 , (DCshortvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
351 , (DCintvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
352 , (DClongvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
353 , (DClonglongvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
354 , (DCfloatvmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
355 , (DCdoublevmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
356 , (DCpointervmfunc*) &dc_callvm_call_ppc64_syscall
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
357 , NULL /* callStruct */
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
358 };
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
359
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
360 void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
361 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
362 DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
363 DCCallVM_vt* vt;
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
364
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
365 switch(mode) {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
366 case DC_CALL_C_DEFAULT:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
367 case DC_CALL_C_PPC64:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
368 case DC_CALL_C_ELLIPSIS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
369 #if DC__ABI_PPC64_ELF_V == 2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
370 vt = &gVT_ppc64;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
371 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
372 case DC_CALL_C_ELLIPSIS_VARARGS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
373 vt = &gVT_ppc64_ellipsis;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
374 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
375 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
376 case DC_CALL_C_ELLIPSIS_VARARGS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
377 vt = &gVT_ppc64;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
378 break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
379 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
380
7
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
381 case DC_CALL_SYS_DEFAULT:
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
382 case DC_CALL_SYS_PPC64:
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
383 vt = &gVT_ppc64_syscall;
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
384 break;
7ca57dbefed4 - ppc64 update from Masanori
cslag
parents: 0
diff changeset
385
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
386 default:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
387 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
388 return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
389 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
390
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
391 dc_callvm_base_init(&self->mInterface, vt);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
392 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
393
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
394 /* Public API. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
395 DCCallVM* dcNewCallVM(DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
396 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
397 DCCallVM_ppc64* p = (DCCallVM_ppc64*)dcAllocMem(sizeof(DCCallVM_ppc64)+size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
398
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
399 dc_callvm_mode_ppc64((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
400
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
401 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
402 dc_callvm_reset_ppc64((DCCallVM*)p);
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
403
67961454902b - bigger cleanup in callvm code
cslag
parents: 83
diff changeset
404 return (DCCallVM*)p;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
405 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
406