annotate dyncall/dyncall_callvm_arm32_thumb.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 15698dc0cba3
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_arm32_thumb.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: ARM 32-bit "thumb" ABI callvm 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
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 84
diff changeset
9 Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 dyncall callvm for 32bit ARM32 family of processors
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 SUPPORTED CALLING CONVENTIONS
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 armthumbcall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 REVISION
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 2007/12/11 initial
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 #include "dyncall_callvm_arm32_thumb.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
44 /*
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
45 ** arm32 thumb mode 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: 281
diff changeset
46 **
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
47 ** - 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: 281
diff changeset
48 **
409
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
49 ** Note: return types of this decl and func below are of double-word size, intentionally
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
50 ** to keep some platforms' compilers from generating code in the callers that reuse, and
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
51 ** thus overwrite, r0 and r1 directly after the call.
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
52 ** With this "hint", we preserve those registers by letting the compiler assume both
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
53 ** registers are used for the return type.
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
54 */
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
55 DClonglong dcCall_arm32_thumb(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: 281
diff changeset
56
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 281
diff changeset
57
409
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
58 /* Call. */
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
59 DClonglong dc_callvm_call_arm32_thumb(DCCallVM* in_self, DCpointer target)
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
60 {
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
61 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
62 return dcCall_arm32_thumb(target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead));
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
63 }
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
64
15698dc0cba3 - regression fix: return values were broken on some arm32-thumb targets
Tassilo Philipp
parents: 366
diff changeset
65
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 static void dc_callvm_mode_arm32_thumb(DCCallVM* in_self,DCint mode);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 static void dc_callvm_free_arm32_thumb(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 dcFreeMem(in_self);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 static void dc_callvm_reset_arm32_thumb(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 dcVecReset(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 static void dc_callvm_argInt_arm32_thumb(DCCallVM* in_self, DCint x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 dcVecAppend(&self->mVecHead, &x, sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 static void dc_callvm_argBool_arm32_thumb(DCCallVM* in_self, DCbool 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 dc_callvm_argInt_arm32_thumb(in_self, (DCint)x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 }
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 static void dc_callvm_argChar_arm32_thumb(DCCallVM* in_self, DCchar x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 dc_callvm_argInt_arm32_thumb(in_self, 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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 static void dc_callvm_argShort_arm32_thumb(DCCallVM* in_self, DCshort x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 dc_callvm_argInt_arm32_thumb(in_self, x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 static void dc_callvm_argLong_arm32_thumb(DCCallVM* in_self, DClong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 dc_callvm_argInt_arm32_thumb(in_self, x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 static void dc_callvm_argLongLong_arm32_thumb(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_arm32_thumb* self = (DCCallVM_arm32_thumb*)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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 static void dc_callvm_argLongLong_arm32_thumb_eabi(DCCallVM* in_self, DClonglong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 /* 64 bit values need to be aligned on 8 byte boundaries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 static void dc_callvm_argFloat_arm32_thumb(DCCallVM* in_self, DCfloat x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134
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_argDouble_arm32_thumb(DCCallVM* in_self, DCdouble 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_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
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 static void dc_callvm_argDouble_arm32_thumb_eabi(DCCallVM* in_self, DCdouble x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 /* 64 bit values need to be aligned on 8 byte boundaries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 static void dc_callvm_argPointer_arm32_thumb(DCCallVM* in_self, DCpointer x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 dcVecAppend(&self->mVecHead, &x, sizeof(DCpointer));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 DCCallVM_vt gVT_arm32_thumb =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 &dc_callvm_free_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 , &dc_callvm_reset_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 , &dc_callvm_mode_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 , &dc_callvm_argBool_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 , &dc_callvm_argChar_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 , &dc_callvm_argShort_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 , &dc_callvm_argInt_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 , &dc_callvm_argLong_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 , &dc_callvm_argLongLong_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 , &dc_callvm_argFloat_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 , &dc_callvm_argDouble_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 , &dc_callvm_argPointer_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 , (DCvoidvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 , (DCboolvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 , (DCcharvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 , (DCshortvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 , (DCintvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 , (DClongvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 , (DClonglongvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 , (DCfloatvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 , (DCdoublevmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 , (DCpointervmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 DCCallVM_vt gVT_arm32_thumb_eabi =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 &dc_callvm_free_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 , &dc_callvm_reset_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 , &dc_callvm_mode_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 , &dc_callvm_argBool_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 , &dc_callvm_argChar_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 , &dc_callvm_argShort_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 , &dc_callvm_argInt_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 , &dc_callvm_argLong_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 , &dc_callvm_argLongLong_arm32_thumb_eabi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 , &dc_callvm_argFloat_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 , &dc_callvm_argDouble_arm32_thumb_eabi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 , &dc_callvm_argPointer_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 , (DCvoidvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 , (DCboolvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 , (DCcharvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 , (DCshortvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 , (DCintvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 , (DClongvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 , (DClonglongvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 , (DCfloatvmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 , (DCdoublevmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 , (DCpointervmfunc*) &dc_callvm_call_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
215
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
216 static void dc_callvm_mode_arm32_thumb(DCCallVM* in_self, DCint mode)
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
217 {
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
218 DCCallVM_arm32_thumb* self = (DCCallVM_arm32_thumb*)in_self;
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
219 DCCallVM_vt* vt;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
221 switch(mode) {
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
222 case DC_CALL_C_ELLIPSIS:
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
223 case DC_CALL_C_ELLIPSIS_VARARGS:
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 /* Check OS if we need EABI as default. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 #if defined(DC__ABI_ARM_EABI)
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
226 case DC_CALL_C_DEFAULT: vt = &gVT_arm32_thumb_eabi; break;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 #else
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
228 case DC_CALL_C_DEFAULT: vt = &gVT_arm32_thumb; break;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 #endif
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
230 case DC_CALL_C_ARM_THUMB: vt = &gVT_arm32_thumb; break;
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
231 case DC_CALL_C_ARM_THUMB_EABI: vt = &gVT_arm32_thumb_eabi; break;
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
232 default:
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
233 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
234 return;
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
235 }
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
236 dc_callvm_base_init(&self->mInterface, vt);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
239 /* Public API. */
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
240 DCCallVM* dcNewCallVM(DCsize size)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
241 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
242 /* Store at least 16 bytes (4 words) for internal spill area. Assembly code depends on it. */
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
243 DCCallVM_arm32_thumb* p = (DCCallVM_arm32_thumb*)dcAllocMem(sizeof(DCCallVM_arm32_thumb)+size+16);
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
244
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
245 dc_callvm_mode_arm32_thumb((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
246
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
247 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
248
67961454902b - bigger cleanup in callvm code
cslag
parents: 27
diff changeset
249 return (DCCallVM*)p;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
250 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251