annotate dyncall/dyncall_callvm_mips_o32.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_mips_o32.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: mips "o32" 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
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 323
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 /*
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 mips o32 abi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 REVISION
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 2010/06/03 initial
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 NOTES:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 we need an argument counter for supporting floating point arguments
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 correctly.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 first two (if any) double/float arguments are mapped via a common structure --
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 code must take care to write the right float argument indices which
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 differs on C and Assembly-side depending on endianness. (therefore
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 both sources have two variants 'mipseb' and 'mipsel'.)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 (only for the first two float/double arguments) see float/double handling
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 although, the abi does not expect usage of floats if first argument is
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 not floating point, the call kernel can be used universal for all cases.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 #include "dyncall_callvm_mips_o32.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 #include "dyncall_utils.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
366
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 323
diff changeset
56 void dcCall_mips_o32(DCpointer target, DCRegData_mips_o32* regdata, DCsize stksize, DCpointer stkdata);
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 323
diff changeset
57
ad5f9803f52f - removal of some unnecessary headers that only contained internally used forward declarations, so no need to have them
Tassilo Philipp
parents: 323
diff changeset
58
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 static void dc_callvm_reset_mips_o32(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 dcVecReset(&self->mVecHead);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 self->mArgCount = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 static void dc_callvm_free_mips_o32(DCCallVM* in_self)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 dcFreeMem(in_self);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 /* arg int -- fillup integer register file OR push on stack */
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_argInt_mips_o32(DCCallVM* in_self, DCint i)
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_mips_o32* self = (DCCallVM_mips_o32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 dcVecAppend(&self->mVecHead, &i, sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 self->mArgCount++;
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_argPointer_mips_o32(DCCallVM* in_self, DCpointer x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 {
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
83 dc_callvm_argInt_mips_o32(in_self, *(DCint*)&x);
0
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 static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 dc_callvm_argInt_mips_o32(in_self, (DCint)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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 static void dc_callvm_argChar_mips_o32(DCCallVM* in_self, DCchar x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 dc_callvm_argInt_mips_o32(in_self, (DCint)x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 }
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_mips_o32(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 dc_callvm_argInt_mips_o32(in_self, (DCint)x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 static void dc_callvm_argLong_mips_o32(DCCallVM* in_self, DClong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 dc_callvm_argInt_mips_o32(in_self, (DCint)x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
106 static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong x)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
109
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 /* 64-bit values need to be aligned on 8 byte boundaries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
112 dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
113 self->mArgCount++;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
120 dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat));
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
121
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
122 #if defined(DC__ABI_HARDFLOAT)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 if (self->mArgCount < 2) {
305
b104c5beec8b - softfloat support for mips64/n64 abi
Tassilo Philipp
parents: 302
diff changeset
124 /* @@@ unsure if we should zero init, here; seems to work as-is */
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
125 # if defined(DC__Endian_LITTLE)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 self->mRegData.u[self->mArgCount].f[0] = x;
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
127 # else
305
b104c5beec8b - softfloat support for mips64/n64 abi
Tassilo Philipp
parents: 302
diff changeset
128 self->mRegData.u[self->mArgCount].f[1] = x; // floats in regs always right justified
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
129 # endif
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
130 # if 0
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 self->mRegData.u[self->mArgCount].f[1] = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 call kernel
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
134 mips:
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
135 lwc1 $f12, 4($5) <--- byte offset 4
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
136 lwc1 $f13, 0($5)
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
137 lwc1 $f14, 12($5) <--- byte offset 12
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
138 lwc1 $f15, 8($5)
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
139 mipsel:
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
140 lwc1 $f12, 0($5) <--- byte offset 4
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
141 lwc1 $f13, 4($5)
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
142 lwc1 $f14, 8($5) <--- byte offset 12
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
143 lwc1 $f15, 12($5)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
145 # if defined(DC__Endian_LITTLE)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 /* index 0 and 2 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 self->mRegData.floats[self->mArgCount*2] = x;
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
148 # else
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 /* index 1 and 3 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 self->mRegData.floats[self->mArgCount*2+1] = x;
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
151 # endif
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
152 # endif
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 }
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
154 #endif /* DC__ABI_HARDFLOAT */
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
155
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 self->mArgCount++;
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 static void dc_callvm_argDouble_mips_o32(DCCallVM* in_self, DCdouble x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 /* 64-bit values need to be aligned on 8 byte boundaries */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
164 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
165
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
166 #if defined(DC__ABI_HARDFLOAT)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 if (self->mArgCount < 2)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 self->mRegData.u[self->mArgCount].d = x;
302
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
169 #endif /* DC__ABI_HARDFLOAT */
d55f9d508074 - mips softfloat support for o32 callconv (calls and callbacks, little and big endian)
Tassilo Philipp
parents: 281
diff changeset
170
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 self->mArgCount++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 /* Call. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 void dc_callvm_call_mips_o32(DCCallVM* in_self, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178
323
6ffb6a00cf55 - cosmetics and comments cleanup for readability
Tassilo Philipp
parents: 305
diff changeset
179 /* provide multiple of 8 (reflecting stack area alignment requirement), and
6ffb6a00cf55 - cosmetics and comments cleanup for readability
Tassilo Philipp
parents: 305
diff changeset
180 minimum of 16-bytes (to hold first 4 int regis as spill area ($4-$7)) */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
186 static void dc_callvm_mode_mips_o32(DCCallVM* in_self, DCint mode);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
187
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 DCCallVM_vt gVT_mips_o32 =
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_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 , &dc_callvm_reset_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 , &dc_callvm_mode_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 , &dc_callvm_argBool_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 , &dc_callvm_argChar_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 , &dc_callvm_argShort_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 , &dc_callvm_argInt_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 , &dc_callvm_argLong_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 , &dc_callvm_argLongLong_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 , &dc_callvm_argFloat_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 , &dc_callvm_argDouble_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 , &dc_callvm_argPointer_mips_o32
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_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 , (DCboolvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 , (DCcharvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
206 , (DCshortvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207 , (DCintvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 , (DClongvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209 , (DClonglongvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 , (DCfloatvmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 , (DCdoublevmfunc*) &dc_callvm_call_mips_o32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212 , (DCpointervmfunc*) &dc_callvm_call_mips_o32
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: 0
diff changeset
216 /* mode: only a single mode available currently. */
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
217 static void dc_callvm_mode_mips_o32(DCCallVM* in_self, DCint mode)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
218 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
219 DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
220 DCCallVM_vt* vt;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
221
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
222 switch(mode) {
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
223 case DC_CALL_C_DEFAULT:
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
224 case DC_CALL_C_MIPS32_O32:
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
225 case DC_CALL_C_ELLIPSIS:
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
226 case DC_CALL_C_ELLIPSIS_VARARGS:
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
227 vt = &gVT_mips_o32;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
228 break;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
229 default:
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
230 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
231 return;
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
232 }
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
233 dc_callvm_base_init(&self->mInterface, vt);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
236 /* Public API. */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 DCCallVM* dcNewCallVM(DCsize size)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
239 DCCallVM_mips_o32* p = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
240
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
241 dc_callvm_mode_mips_o32((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
242
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
243 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
244 dc_callvm_reset_mips_o32((DCCallVM*)p);
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
245
67961454902b - bigger cleanup in callvm code
cslag
parents: 0
diff changeset
246 return (DCCallVM*)p;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
247 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248