annotate dyncall/dyncall_callvm_x86.c @ 465:e2899b4ff713

- // -> /* */, mainly for consistency (but also for a few obscure compilers)
author Tassilo Philipp
date Wed, 02 Feb 2022 12:55:23 +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_x86.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Call VM for x86 architecture implementation
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
339
4f9f49fb82ce - x64 SysV syscall support
Tassilo Philipp
parents: 281
diff changeset
9 Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "dyncall_callvm_x86.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
32 /*
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
33 ** x86 calling convention calls
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
34 **
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
35 ** - 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: 365
diff changeset
36 **
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
37 */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
38
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
39 #if defined(DC__OS_Plan9) /* No support for other cconvs on Plan9 and vice-versa. */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
40 void dcCall_x86_plan9 (DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
41 #else
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
42 void dcCall_x86_cdecl (DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
43 void dcCall_x86_win32_std (DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
44 void dcCall_x86_win32_fast (DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
45 void dcCall_x86_win32_msthis (DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
46 void dcCall_x86_syscall_int80h_linux(DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
47 void dcCall_x86_syscall_int80h_bsd (DCpointer target, DCpointer stackdata, DCsize size);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
48 #endif
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
49
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 365
diff changeset
50
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 /* call vm destructor */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 static void dc_callvm_free_x86(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 dcFreeMem(in_self);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 /* reset */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 static void dc_callvm_reset_x86(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 dcVecReset(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 self->mIntRegs = 0;
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 /* arg (bool,char,short,long auto-promoted) to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 static void dc_callvm_argInt_x86(DCCallVM* in_self, DCint x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 dcVecAppend(&self->mVecHead, &x, sizeof(DCint) );
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 /* arg bool - promoted to int */
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_argBool_x86(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 dc_callvm_argInt_x86(in_self, v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 /* arg char - promoted to int */
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_argChar_x86(DCCallVM* in_self, DCchar x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 dc_callvm_argInt_x86(in_self, v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 /* arg short - promoted to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 static void dc_callvm_argShort_x86(DCCallVM* in_self, DCshort x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 dc_callvm_argInt_x86(in_self, v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 /* arg long - promoted to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 static void dc_callvm_argLong_x86(DCCallVM* in_self, DClong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 dc_callvm_argInt_x86(in_self, v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 /* arg long long */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 static void dc_callvm_argLongLong_x86(DCCallVM* in_self, DClonglong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong) );
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 /* arg float */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 static void dc_callvm_argFloat_x86(DCCallVM* in_self, DCfloat x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 /* arg double */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 static void dc_callvm_argDouble_x86(DCCallVM* in_self, DCdouble x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 /* arg pointer */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 static void dc_callvm_argPointer_x86(DCCallVM* in_self, DCpointer x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 /* Plan9 specific calling convention. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 #if defined(DC__OS_Plan9)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 /* call 'plan9' */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 void dc_callvm_call_x86_plan9(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 /* Calls with 32-bit return values have it returned via EAX, so we don't */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 /* need to do anything special here. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 dcCall_x86_plan9(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead));
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 DClonglong dc_callvm_call_x86_plan9_ll(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 /* Call for 64 bit integer return values is a bit different, call a */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 /* different assembler stub that stores the return value in a variable */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 /* for us, and return the latter. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 DClonglong ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 dcCall_x86_plan9_ll(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead), &ret );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 return ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 DCCallVM_vt gVT_x86_plan9 =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 , &dc_callvm_reset_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 , &dc_callvm_argBool_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 , &dc_callvm_argChar_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 , &dc_callvm_argShort_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 , &dc_callvm_argInt_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 , &dc_callvm_argLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 , &dc_callvm_argPointer_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 , (DCvoidvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 , (DCboolvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 , (DCcharvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 , (DCshortvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 , (DCintvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 , (DClongvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 , (DClonglongvmfunc*) &dc_callvm_call_x86_plan9_ll
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 , (DCfloatvmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 , (DCdoublevmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 , (DCpointervmfunc*) &dc_callvm_call_x86_plan9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 };
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 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 /* call 'cdecl' */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 void dc_callvm_call_x86_cdecl(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 dcCall_x86_cdecl( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 DCCallVM_vt gVT_x86_cdecl =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 , &dc_callvm_reset_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 , &dc_callvm_argBool_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 , &dc_callvm_argChar_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 , &dc_callvm_argShort_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215 , &dc_callvm_argInt_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
216 , &dc_callvm_argLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 , &dc_callvm_argPointer_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 , (DCvoidvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 , (DCboolvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 , (DCcharvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 , (DCshortvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 , (DCintvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 , (DClongvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 , (DClonglongvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 , (DCfloatvmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 , (DCdoublevmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 , (DCpointervmfunc*) &dc_callvm_call_x86_cdecl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 };
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 /* --- stdcall -------------------------------------------------------------- */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239 /* call win32/std */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
240
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 void dc_callvm_call_x86_win32_std(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
242 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
243 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
244 dcCall_x86_win32_std( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
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 /* win32/std vtable */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249 DCCallVM_vt gVT_x86_win32_std =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252 , &dc_callvm_reset_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
253 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
254 , &dc_callvm_argBool_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
255 , &dc_callvm_argChar_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
256 , &dc_callvm_argShort_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
257 , &dc_callvm_argInt_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
258 , &dc_callvm_argLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
259 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
260 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
261 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
262 , &dc_callvm_argPointer_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
263 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
264 , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
265 , (DCboolvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
266 , (DCcharvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
267 , (DCshortvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
268 , (DCintvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
269 , (DClongvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
270 , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
271 , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
272 , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
273 , (DCpointervmfunc*) &dc_callvm_call_x86_win32_std
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
274 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
275 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
276
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
277
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
278 /* --- fastcall common (ms/gnu) -------------------------------------------- */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
279
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
280 /* call win32 ms fast */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
281
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
282 static void dc_callvm_call_x86_win32_fast(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
283 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
284 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
285 dcCall_x86_win32_fast( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
286 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
287
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
288 /* reset - always resize to 8 bytes (stores ECX and EDX) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
289
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
290 static void dc_callvm_reset_x86_win32_fast(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
291 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
292 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
293 dcVecResize(&self->mVecHead, sizeof(DCint) * 2 );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
294 self->mIntRegs = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
295 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
296
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
297
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
298 /* --- fastcall ms --------------------------------------------------------- */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
299
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
300 /* arg int - probably hold in ECX and EDX */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
301
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
302 static void dc_callvm_argInt_x86_win32_fast_ms(DCCallVM* in_self, DCint x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
303 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
304 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
305 if (self->mIntRegs < 2) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
306 *( (int*) dcVecAt(&self->mVecHead, sizeof(DCint) * self->mIntRegs ) ) = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
307 ++( self->mIntRegs );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
308 } else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
309 dcVecAppend(&self->mVecHead, &x, sizeof(DCint) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
310 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
311
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
312 /* arg bool - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
313
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
314 static void dc_callvm_argBool_x86_win32_fast_ms(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
315 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
316 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
317 dc_callvm_argInt_x86_win32_fast_ms(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
318 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
319
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
320 /* arg char - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
321
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
322 static void dc_callvm_argChar_x86_win32_fast_ms(DCCallVM* in_self, DCchar x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
323 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
324 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
325 dc_callvm_argInt_x86_win32_fast_ms(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
326 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
327
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
328 /* arg short - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
329
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
330 static void dc_callvm_argShort_x86_win32_fast_ms(DCCallVM* in_self, DCshort x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
331 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
332 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
333 dc_callvm_argInt_x86_win32_fast_ms(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
334 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
335
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
336 /* arg long - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
337
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
338 static void dc_callvm_argLong_x86_win32_fast_ms(DCCallVM* in_self, DClong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
339 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
340 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
341 dc_callvm_argInt_x86_win32_fast_ms(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
342 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
343
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
344 /* arg pointer - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
345
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
346 static void dc_callvm_argPointer_x86_win32_fast_ms(DCCallVM* in_self, DCpointer x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
347 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
348 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
349 dc_callvm_argInt_x86_win32_fast_ms(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
350 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
351
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
352 /* win32/fast vt */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
353
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
354 DCCallVM_vt gVT_x86_win32_fast_ms =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
355 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
356 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
357 , &dc_callvm_reset_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
358 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
359 , &dc_callvm_argBool_x86_win32_fast_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
360 , &dc_callvm_argChar_x86_win32_fast_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
361 , &dc_callvm_argShort_x86_win32_fast_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
362 , &dc_callvm_argInt_x86_win32_fast_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
363 , &dc_callvm_argLong_x86_win32_fast_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
364 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
365 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
366 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
367 , &dc_callvm_argPointer_x86_win32_fast_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
368 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
369 , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
370 , (DCboolvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
371 , (DCcharvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
372 , (DCshortvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
373 , (DCintvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
374 , (DClongvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
375 , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
376 , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
377 , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
378 , (DCpointervmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
379 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
380 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
381
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
382
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
383 /* --- gnu fastcall -------------------------------------------------------- */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
384
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
385 /* arg int - probably hold in ECX and EDX */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
386
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
387 static void dc_callvm_argInt_x86_win32_fast_gnu(DCCallVM* in_self, DCint x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
388 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
389 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
390 if (self->mIntRegs < 2) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
391 *( (int*) dcVecAt(&self->mVecHead, sizeof(DCint) * self->mIntRegs ) ) = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
392 ++( self->mIntRegs );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
393 } else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
394 dcVecAppend(&self->mVecHead, &x, sizeof(DCint) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
395 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
396
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
397 /* arg bool - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
398
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
399 static void dc_callvm_argBool_x86_win32_fast_gnu(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
400 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
401 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
402 dc_callvm_argInt_x86_win32_fast_gnu(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
403 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
404
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
405 /* arg char - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
406
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
407 static void dc_callvm_argChar_x86_win32_fast_gnu(DCCallVM* in_self, DCchar x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
408 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
409 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
410 dc_callvm_argInt_x86_win32_fast_gnu(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
411 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
412
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
413 /* arg short - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
414
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
415 static void dc_callvm_argShort_x86_win32_fast_gnu(DCCallVM* in_self, DCshort x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
416 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
417 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
418 dc_callvm_argInt_x86_win32_fast_gnu(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
419 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
420
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
421 /* arg long - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
422
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
423 static void dc_callvm_argLong_x86_win32_fast_gnu(DCCallVM* in_self, DClong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
424 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
425 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
426 dc_callvm_argInt_x86_win32_fast_gnu(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
427 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
428
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
429 /* arg pointer - promote to int */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
430
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
431 static void dc_callvm_argPointer_x86_win32_fast_gnu(DCCallVM* in_self, DCpointer x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
432 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
433 DCint v = (DCint) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
434 dc_callvm_argInt_x86_win32_fast_gnu(in_self,v);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
435 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
436
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
437 /* arg long long - skip registers and push on stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
438
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
439 static void dc_callvm_argLongLong_x86_win32_fast_gnu(DCCallVM* in_self, DClonglong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
440 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
441 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
442 self->mIntRegs = 2;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
443 dc_callvm_argLongLong_x86(in_self,x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
444 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
445
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
446 /* win32/fast/gnu vt */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
447
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
448 DCCallVM_vt gVT_x86_win32_fast_gnu =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
449 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
450 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
451 , &dc_callvm_reset_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
452 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
453 , &dc_callvm_argBool_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
454 , &dc_callvm_argChar_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
455 , &dc_callvm_argShort_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
456 , &dc_callvm_argInt_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
457 , &dc_callvm_argLong_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
458 , &dc_callvm_argLongLong_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
459 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
460 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
461 , &dc_callvm_argPointer_x86_win32_fast_gnu
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
462 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
463 , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
464 , (DCboolvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
465 , (DCcharvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
466 , (DCshortvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
467 , (DCintvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
468 , (DClongvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
469 , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
470 , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
471 , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
472 , (DCpointervmfunc*) &dc_callvm_call_x86_win32_fast
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
473 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
474 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
475
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
476
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
477 /* --- this ms ------------------------------------------------------------- */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
478
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
479 /* call win32/this/ms */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
480
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
481 void dc_callvm_call_x86_win32_this_ms(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
482 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
483 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
484 dcCall_x86_win32_msthis( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
485 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
486
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
487 /* win32/this/ms vt */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
488
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
489 DCCallVM_vt gVT_x86_win32_this_ms =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
490 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
491 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
492 , &dc_callvm_reset_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
493 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
494 , &dc_callvm_argBool_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
495 , &dc_callvm_argChar_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
496 , &dc_callvm_argShort_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
497 , &dc_callvm_argInt_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
498 , &dc_callvm_argLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
499 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
500 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
501 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
502 , &dc_callvm_argPointer_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
503 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
504 , (DCvoidvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
505 , (DCboolvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
506 , (DCcharvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
507 , (DCshortvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
508 , (DCintvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
509 , (DClongvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
510 , (DClonglongvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
511 , (DCfloatvmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
512 , (DCdoublevmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
513 , (DCpointervmfunc*) &dc_callvm_call_x86_win32_this_ms
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
514 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
515 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
516
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
517 /* --- syscall ------------------------------------------------------------- */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
518
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
519 /* call syscall */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
520
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
521 void dc_callvm_call_x86_syscall_int80h_linux(DCCallVM* in_self, DCpointer target)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
522 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
523 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
524 dcCall_x86_syscall_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
525 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
526
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
527 void dc_callvm_call_x86_syscall_int80h_bsd(DCCallVM* in_self, DCpointer target)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
528 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
529 DCCallVM_x86* self = (DCCallVM_x86*) in_self;
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
530 dcCall_x86_syscall_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
531 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
532
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
533 DCCallVM_vt gVT_x86_syscall_int80h_linux =
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
534 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
535 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
536 , &dc_callvm_reset_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
537 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
538 , &dc_callvm_argBool_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
539 , &dc_callvm_argChar_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
540 , &dc_callvm_argShort_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
541 , &dc_callvm_argInt_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
542 , &dc_callvm_argLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
543 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
544 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
545 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
546 , &dc_callvm_argPointer_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
547 , NULL /* argStruct */
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
548 , (DCvoidvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
549 , (DCboolvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
550 , (DCcharvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
551 , (DCshortvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
552 , (DCintvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
553 , (DClongvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
554 , (DClonglongvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
555 , (DCfloatvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
556 , (DCdoublevmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
557 , (DCpointervmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
558 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
559 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
560
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
561 DCCallVM_vt gVT_x86_syscall_int80h_bsd =
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
562 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
563 &dc_callvm_free_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
564 , &dc_callvm_reset_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
565 , &dc_callvm_mode_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
566 , &dc_callvm_argBool_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
567 , &dc_callvm_argChar_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
568 , &dc_callvm_argShort_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
569 , &dc_callvm_argInt_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
570 , &dc_callvm_argLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
571 , &dc_callvm_argLongLong_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
572 , &dc_callvm_argFloat_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
573 , &dc_callvm_argDouble_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
574 , &dc_callvm_argPointer_x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
575 , NULL /* argStruct */
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
576 , (DCvoidvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
577 , (DCboolvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
578 , (DCcharvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
579 , (DCshortvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
580 , (DCintvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
581 , (DClongvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
582 , (DClonglongvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
583 , (DCfloatvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
584 , (DCdoublevmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
585 , (DCpointervmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
586 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
587 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
588
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
589
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
590 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
591
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
592
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
593 /* mode */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
594
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
595 void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
596 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
597 DCCallVM_x86* self = (DCCallVM_x86*)in_self;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
598 DCCallVM_vt* vt;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
599
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
600 switch(mode) {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
601 case DC_CALL_C_DEFAULT:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
602 case DC_CALL_C_ELLIPSIS:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
603 case DC_CALL_C_ELLIPSIS_VARARGS:
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
604 /* Plan9 (and forks) have their own calling convention (and no support for foreign ones). */
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
605 #if defined(DC_PLAN9)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
606 case DC_CALL_C_X86_PLAN9: vt = &gVT_x86_plan9; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
607 #else
465
e2899b4ff713 - // -> /* */, mainly for consistency (but also for a few obscure compilers)
Tassilo Philipp
parents: 366
diff changeset
608 case DC_CALL_C_X86_CDECL: vt = &gVT_x86_cdecl; break; /* also handles DC_CALL_C_X86_WIN32_THIS_GNU */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
609 case DC_CALL_C_X86_WIN32_STD: vt = &gVT_x86_win32_std; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
610 case DC_CALL_C_X86_WIN32_FAST_MS: vt = &gVT_x86_win32_fast_ms; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
611 case DC_CALL_C_X86_WIN32_THIS_MS: vt = &gVT_x86_win32_this_ms; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
612 case DC_CALL_C_X86_WIN32_FAST_GNU: vt = &gVT_x86_win32_fast_gnu; break;
339
4f9f49fb82ce - x64 SysV syscall support
Tassilo Philipp
parents: 281
diff changeset
613 case DC_CALL_SYS_DEFAULT:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
614 # if defined DC_UNIX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
615 # if defined DC__OS_Linux
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
616 vt = &gVT_x86_syscall_int80h_linux; break;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
617 # else
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
618 vt = &gVT_x86_syscall_int80h_bsd; break;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
619 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
620 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
621 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
622 # endif
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
623 case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_syscall_int80h_linux; break;
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 339
diff changeset
624 case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_syscall_int80h_bsd; break;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
625 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
626 default:
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
627 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
628 return;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
629 }
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
630 dc_callvm_base_init(&self->mInterface, vt);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
631 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
632
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
633 /* Public API. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
634 DCCallVM* dcNewCallVM(DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
635 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
636 DCCallVM_x86* p = (DCCallVM_x86*)dcAllocMem(sizeof(DCCallVM_x86)+size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
637
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
638 dc_callvm_mode_x86((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
639
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
640 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
641 dc_callvm_reset_x86((DCCallVM*)p);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
642
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
643 return (DCCallVM*)p;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
644 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
645