Mercurial > pub > dyncall > dyncall
comparison dyncall/dyncall_callvm_sparc_v9.c @ 0:3e629dc19168
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:24:28 +0100 |
parents | |
children | 67961454902b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:3e629dc19168 |
---|---|
1 /* | |
2 | |
3 Package: dyncall | |
4 Library: dyncall | |
5 File: dyncall/dyncall_callvm_sparc_v9.c | |
6 Description: Call VM for sparc-v9 ABI. | |
7 License: | |
8 | |
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de> | |
10 | |
11 Permission to use, copy, modify, and distribute this software for any | |
12 purpose with or without fee is hereby granted, provided that the above | |
13 copyright notice and this permission notice appear in all copies. | |
14 | |
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
22 | |
23 */ | |
24 | |
25 | |
26 | |
27 #include "dyncall_callvm_sparc_v9.h" | |
28 #include "dyncall_call_sparc_v9.h" | |
29 #include "dyncall_alloc.h" | |
30 | |
31 /* Reset argument buffer. */ | |
32 static void dc_callvm_reset_v9(DCCallVM* in_self) | |
33 { | |
34 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
35 dcVecResize(&self->mVecHead,0); | |
36 } | |
37 | |
38 /* Construtor. */ | |
39 static DCCallVM* dc_callvm_new_v9(DCCallVM_vt* vt, DCsize size) | |
40 { | |
41 DCCallVM_v9* self = (DCCallVM_v9*) dcAllocMem(sizeof(DCCallVM_v9)+size); | |
42 dc_callvm_base_init(&self->mInterface, vt); | |
43 dcVecInit(&self->mVecHead,size); | |
44 dc_callvm_reset_v9(&self->mInterface); | |
45 return (DCCallVM*)self; | |
46 } | |
47 | |
48 /* Destructor. */ | |
49 static void dc_callvm_free_v9(DCCallVM* in_self) | |
50 { | |
51 dcFreeMem(in_self); | |
52 } | |
53 | |
54 static void dc_callvm_argLongLong_v9(DCCallVM* in_self, DClonglong x) | |
55 { | |
56 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
57 dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); | |
58 } | |
59 | |
60 /* all integers are promoted to 64-bit. */ | |
61 static void dc_callvm_argLong_v9 (DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
62 static void dc_callvm_argInt_v9 (DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
63 static void dc_callvm_argBool_v9 (DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
64 static void dc_callvm_argChar_v9 (DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
65 static void dc_callvm_argShort_v9 (DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
66 static void dc_callvm_argPointer_v9(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
67 | |
68 static void dc_callvm_argDouble_v9(DCCallVM* in_self, DCdouble x) | |
69 { | |
70 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
71 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); | |
72 } | |
73 | |
74 static void dc_callvm_argDouble_v9_ellipsis(DCCallVM* in_self, DCdouble x) | |
75 { | |
76 union { | |
77 long long l; | |
78 double d; | |
79 } u; | |
80 u.d = x; | |
81 dc_callvm_argLongLong_v9(in_self, u.l); | |
82 } | |
83 | |
84 static void dc_callvm_argFloat_v9_ellipsis(DCCallVM* in_self, DCfloat x) | |
85 { | |
86 dc_callvm_argDouble_v9_ellipsis(in_self, (DCdouble) x); | |
87 } | |
88 | |
89 static void dc_callvm_argFloat_v9(DCCallVM* in_self, DCfloat x) | |
90 { | |
91 union { | |
92 double d; | |
93 float f[2]; | |
94 } u; | |
95 u.f[1] = x; | |
96 dc_callvm_argDouble_v9(in_self, u.d); | |
97 } | |
98 | |
99 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode); | |
100 | |
101 DCCallVM_vt gVT_v9_ellipsis = | |
102 { | |
103 &dc_callvm_free_v9, | |
104 &dc_callvm_reset_v9, | |
105 &dc_callvm_mode_v9, | |
106 &dc_callvm_argBool_v9, | |
107 &dc_callvm_argChar_v9, | |
108 &dc_callvm_argShort_v9, | |
109 &dc_callvm_argInt_v9, | |
110 &dc_callvm_argLong_v9, | |
111 &dc_callvm_argLongLong_v9, | |
112 &dc_callvm_argFloat_v9_ellipsis, | |
113 &dc_callvm_argDouble_v9_ellipsis, | |
114 &dc_callvm_argPointer_v9, | |
115 NULL /* argStruct */, | |
116 (DCvoidvmfunc*) &dcCall_v9, | |
117 (DCboolvmfunc*) &dcCall_v9, | |
118 (DCcharvmfunc*) &dcCall_v9, | |
119 (DCshortvmfunc*) &dcCall_v9, | |
120 (DCintvmfunc*) &dcCall_v9, | |
121 (DClongvmfunc*) &dcCall_v9, | |
122 (DClonglongvmfunc*) &dcCall_v9, | |
123 (DCfloatvmfunc*) &dcCall_v9, | |
124 (DCdoublevmfunc*) &dcCall_v9, | |
125 (DCpointervmfunc*) &dcCall_v9, | |
126 NULL /* callStruct */ | |
127 }; | |
128 | |
129 /* CallVM virtual table. */ | |
130 DCCallVM_vt gVT_v9 = | |
131 { | |
132 &dc_callvm_free_v9, | |
133 &dc_callvm_reset_v9, | |
134 &dc_callvm_mode_v9, | |
135 &dc_callvm_argBool_v9, | |
136 &dc_callvm_argChar_v9, | |
137 &dc_callvm_argShort_v9, | |
138 &dc_callvm_argInt_v9, | |
139 &dc_callvm_argLong_v9, | |
140 &dc_callvm_argLongLong_v9, | |
141 &dc_callvm_argFloat_v9, | |
142 &dc_callvm_argDouble_v9, | |
143 &dc_callvm_argPointer_v9, | |
144 NULL /* argStruct */, | |
145 (DCvoidvmfunc*) &dcCall_v9, | |
146 (DCboolvmfunc*) &dcCall_v9, | |
147 (DCcharvmfunc*) &dcCall_v9, | |
148 (DCshortvmfunc*) &dcCall_v9, | |
149 (DCintvmfunc*) &dcCall_v9, | |
150 (DClongvmfunc*) &dcCall_v9, | |
151 (DClonglongvmfunc*) &dcCall_v9, | |
152 (DCfloatvmfunc*) &dcCall_v9, | |
153 (DCdoublevmfunc*) &dcCall_v9, | |
154 (DCpointervmfunc*) &dcCall_v9, | |
155 NULL /* callStruct */ | |
156 }; | |
157 | |
158 /* mode: only a single mode available currently. */ | |
159 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode) | |
160 { | |
161 switch(mode) { | |
162 case DC_CALL_C_DEFAULT: | |
163 case DC_CALL_C_ELLIPSIS: | |
164 case DC_CALL_C_SPARC64: | |
165 in_self->mVTpointer = &gVT_v9; | |
166 break; | |
167 case DC_CALL_C_ELLIPSIS_VARARGS: | |
168 in_self->mVTpointer = &gVT_v9_ellipsis; | |
169 break; | |
170 default: | |
171 in_self->mError = DC_ERROR_UNSUPPORTED_MODE; | |
172 break; | |
173 } | |
174 } | |
175 | |
176 | |
177 /* Public API. */ | |
178 DCCallVM* dcNewCallVM(DCsize size) | |
179 { | |
180 return dc_callvm_new_v9(&gVT_v9,size); | |
181 } | |
182 |