annotate dyncall/dyncall_callvm_ppc64.c @ 357:d982a00c2177

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