annotate dyncall/dyncall_callvm_x86.c @ 457:90b1d927912a

- suite_aggrs: make sure random memory used doesn't ever result in NaN fp values (for every possible address), as this messes with result comparison
author Tassilo Philipp
date Fri, 28 Jan 2022 14:11:21 +0100
parents ad5f9803f52f
children e2899b4ff713
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
365
1d03a3a4220d - fixing issue after having aliased gnu thiscalls to cdecl with a duped switch label
Tassilo Philipp
parents: 341
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