comparison dyncall/dyncall_callvm_sparc64.c @ 178:183594497726

- renamed sparc_v9 -> sparc64 for consistency (with other platforms using 32/64 suffix instead of instrset name)
author cslag
date Fri, 10 Feb 2017 00:58:08 +0100
parents dyncall/dyncall_callvm_sparc_v9.c@67961454902b
children f5577f6bf97a
comparison
equal deleted inserted replaced
177:8304f1b31af9 178:183594497726
1 /*
2
3 Package: dyncall
4 Library: dyncall
5 File: dyncall/dyncall_callvm_sparc64.c
6 Description: Call VM for sparc64 (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_sparc64.h"
28 #include "dyncall_call_sparc64.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
39 /* Destructor. */
40 static void dc_callvm_free_v9(DCCallVM* in_self)
41 {
42 dcFreeMem(in_self);
43 }
44
45 static void dc_callvm_argLongLong_v9(DCCallVM* in_self, DClonglong x)
46 {
47 DCCallVM_v9* self = (DCCallVM_v9*)in_self;
48 dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
49 }
50
51 /* all integers are promoted to 64-bit. */
52 static void dc_callvm_argLong_v9 (DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); }
53 static void dc_callvm_argInt_v9 (DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); }
54 static void dc_callvm_argBool_v9 (DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); }
55 static void dc_callvm_argChar_v9 (DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); }
56 static void dc_callvm_argShort_v9 (DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); }
57 static void dc_callvm_argPointer_v9(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); }
58
59 static void dc_callvm_argDouble_v9(DCCallVM* in_self, DCdouble x)
60 {
61 DCCallVM_v9* self = (DCCallVM_v9*)in_self;
62 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
63 }
64
65 static void dc_callvm_argDouble_v9_ellipsis(DCCallVM* in_self, DCdouble x)
66 {
67 union {
68 long long l;
69 double d;
70 } u;
71 u.d = x;
72 dc_callvm_argLongLong_v9(in_self, u.l);
73 }
74
75 static void dc_callvm_argFloat_v9_ellipsis(DCCallVM* in_self, DCfloat x)
76 {
77 dc_callvm_argDouble_v9_ellipsis(in_self, (DCdouble) x);
78 }
79
80 static void dc_callvm_argFloat_v9(DCCallVM* in_self, DCfloat x)
81 {
82 union {
83 double d;
84 float f[2];
85 } u;
86 u.f[1] = x;
87 dc_callvm_argDouble_v9(in_self, u.d);
88 }
89
90 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode);
91
92 DCCallVM_vt gVT_v9_ellipsis =
93 {
94 &dc_callvm_free_v9,
95 &dc_callvm_reset_v9,
96 &dc_callvm_mode_v9,
97 &dc_callvm_argBool_v9,
98 &dc_callvm_argChar_v9,
99 &dc_callvm_argShort_v9,
100 &dc_callvm_argInt_v9,
101 &dc_callvm_argLong_v9,
102 &dc_callvm_argLongLong_v9,
103 &dc_callvm_argFloat_v9_ellipsis,
104 &dc_callvm_argDouble_v9_ellipsis,
105 &dc_callvm_argPointer_v9,
106 NULL /* argStruct */,
107 (DCvoidvmfunc*) &dcCall_v9,
108 (DCboolvmfunc*) &dcCall_v9,
109 (DCcharvmfunc*) &dcCall_v9,
110 (DCshortvmfunc*) &dcCall_v9,
111 (DCintvmfunc*) &dcCall_v9,
112 (DClongvmfunc*) &dcCall_v9,
113 (DClonglongvmfunc*) &dcCall_v9,
114 (DCfloatvmfunc*) &dcCall_v9,
115 (DCdoublevmfunc*) &dcCall_v9,
116 (DCpointervmfunc*) &dcCall_v9,
117 NULL /* callStruct */
118 };
119
120 /* CallVM virtual table. */
121 DCCallVM_vt gVT_v9 =
122 {
123 &dc_callvm_free_v9,
124 &dc_callvm_reset_v9,
125 &dc_callvm_mode_v9,
126 &dc_callvm_argBool_v9,
127 &dc_callvm_argChar_v9,
128 &dc_callvm_argShort_v9,
129 &dc_callvm_argInt_v9,
130 &dc_callvm_argLong_v9,
131 &dc_callvm_argLongLong_v9,
132 &dc_callvm_argFloat_v9,
133 &dc_callvm_argDouble_v9,
134 &dc_callvm_argPointer_v9,
135 NULL /* argStruct */,
136 (DCvoidvmfunc*) &dcCall_v9,
137 (DCboolvmfunc*) &dcCall_v9,
138 (DCcharvmfunc*) &dcCall_v9,
139 (DCshortvmfunc*) &dcCall_v9,
140 (DCintvmfunc*) &dcCall_v9,
141 (DClongvmfunc*) &dcCall_v9,
142 (DClonglongvmfunc*) &dcCall_v9,
143 (DCfloatvmfunc*) &dcCall_v9,
144 (DCdoublevmfunc*) &dcCall_v9,
145 (DCpointervmfunc*) &dcCall_v9,
146 NULL /* callStruct */
147 };
148
149 /* mode: only a single mode available currently. */
150 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode)
151 {
152 DCCallVM_v9* self = (DCCallVM_v9*)in_self;
153 DCCallVM_vt* vt;
154
155 switch(mode) {
156 case DC_CALL_C_DEFAULT:
157 case DC_CALL_C_SPARC64:
158 case DC_CALL_C_ELLIPSIS:
159 vt = &gVT_v9;
160 break;
161 case DC_CALL_C_ELLIPSIS_VARARGS:
162 vt = &gVT_v9_ellipsis;
163 break;
164 default:
165 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
166 return;
167 }
168 dc_callvm_base_init(&self->mInterface, vt);
169 }
170
171 /* Public API. */
172 DCCallVM* dcNewCallVM(DCsize size)
173 {
174 DCCallVM_v9* p = (DCCallVM_v9*)dcAllocMem(sizeof(DCCallVM_v9)+size);
175
176 dc_callvm_mode_v9((DCCallVM*)p, DC_CALL_C_DEFAULT);
177
178 dcVecInit(&p->mVecHead,size);
179 dc_callvm_reset_v9(&p->mInterface);
180
181 return (DCCallVM*)p;
182 }
183