annotate dyncall/dyncall_callvm_arm64_apple.c @ 357:d982a00c2177

- PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
author Tassilo Philipp
date Tue, 25 Feb 2020 18:16:13 +0100
parents f5577f6bf97a
children ad5f9803f52f
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_arm64_apple.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: ARM 64-bit Apple ABI 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) 2015-2018 Daniel Adler <dadler@uni-goettingen.de>,
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 84
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
0
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 #include "dyncall_callvm_arm64.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "dyncall_alloc.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 static void reset(DCCallVM* in_p)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 p->i = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 p->f = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 dcVecReset(&p->mVecHead);
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 static void deinit(DCCallVM* in_p)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 dcFreeMem(in_p);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 static void a_i64(DCCallVM* in_p, DClonglong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 if (p->i < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 p->I[p->i] = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 p->i++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 dcVecAlign(&p->mVecHead, sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 dcVecAppend(&p->mVecHead, &x, sizeof(DClonglong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
8
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
59 static void var_i64 (DCCallVM* in_p, DClonglong x)
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
60 {
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
61 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
62 dcVecAlign(&p->mVecHead, sizeof(DClonglong));
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
63 dcVecAppend(&p->mVecHead, &x, sizeof(DClonglong));
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
64 }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
65 static void var_bool (DCCallVM* in_p, DCbool x) { var_i64( in_p, ((DClonglong) x) ); }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
66 static void var_char (DCCallVM* in_p, DCchar x) { var_i64( in_p, ((DClonglong) x) ); }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
67 static void var_short (DCCallVM* in_p, DCshort x) { var_i64( in_p, ((DClonglong) x) ); }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
68 static void var_int (DCCallVM* in_p, DCint x) { var_i64( in_p, ((DClonglong) x) ); }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
69 static void var_long (DCCallVM* in_p, DClong x) { var_i64( in_p, ((DClonglong) x) ); }
12
35ca16453c12 minor typo fix for arm64/apple
dadler
parents: 8
diff changeset
70 static void var_double (DCCallVM* in_p, DCdouble x) {
8
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
71 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
72 dcVecAlign(&p->mVecHead, sizeof(DCdouble));
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
73 dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble));
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
74 }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
75 static void var_float (DCCallVM* in_p, DCfloat x) {
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
76 var_double( in_p, (DCdouble) x );
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
77 }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
78 static void var_pointer (DCCallVM* in_p, DCpointer x) {
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
79 var_i64(in_p, (DClonglong) x );
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
80 }
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
81
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 static void a_bool (DCCallVM* in_p, DCbool x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 if (p->i < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 p->I[p->i] = (DClonglong) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 p->i++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 dcVecAlign(&p->mVecHead, sizeof(DCbool));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 dcVecAppend(&p->mVecHead, &x, sizeof(DCbool));
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 static void a_char (DCCallVM* in_p, DCchar 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 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 if (p->i < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 p->I[p->i] = (DClonglong) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 p->i++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 dcVecAppend(&p->mVecHead, &x, sizeof(DCchar));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 static void a_short (DCCallVM* in_p, DCshort 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 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 if (p->i < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 p->I[p->i] = (DClonglong) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 p->i++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 dcVecAlign(&p->mVecHead, sizeof(DCshort));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 dcVecAppend(&p->mVecHead, &x, sizeof(DCshort));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 static void a_int (DCCallVM* in_p, DCint x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 if (p->i < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 p->I[p->i] = (DClonglong) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 p->i++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 dcVecAlign(&p->mVecHead, sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 dcVecAppend(&p->mVecHead, &x, sizeof(DCint));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 static void a_long (DCCallVM* in_p, DClong x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 if (p->i < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 p->I[p->i] = (DClonglong) x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 p->i++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 dcVecAlign(&p->mVecHead, sizeof(DClong));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 dcVecAppend(&p->mVecHead, &x, sizeof(DClong));
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 a_pointer (DCCallVM* in_p, DCpointer x) { a_i64(in_p, (DClonglong) 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 static void a_float(DCCallVM* in_p, DCfloat x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 if (p->f < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 p->u.S[ p->f << 1 ] = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 p->f++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 dcVecAlign(&p->mVecHead, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 dcVecAppend(&p->mVecHead, &x, sizeof(DCfloat));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 static void a_double(DCCallVM* in_p, DCdouble x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 if (p->f < 8) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 p->u.D[ p->f ] = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 p->f++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 dcVecAlign(&p->mVecHead, sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 dcVecAppend(&p->mVecHead, &x, sizeof(DCdouble));
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 void call(DCCallVM* in_p, DCpointer target)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 DCCallVM_arm64* p = (DCCallVM_arm64*)in_p;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 ** copy 'size' argument is given in number of 16-byte 'pair' blocks.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 dcCall_arm64(target, dcVecData(&p->mVecHead), ( dcVecSize(&p->mVecHead) + 15 ) & -16, &p->u.S[0]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
174 static void mode(DCCallVM* in_p,DCint mode);
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
175
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 DCCallVM_vt vt_arm64 =
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 &deinit
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179 , &reset
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 , &mode
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 , &a_bool
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182 , &a_char
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 , &a_short
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184 , &a_int
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
185 , &a_long
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
186 , &a_i64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 , &a_float
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
188 , &a_double
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 , &a_pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 , NULL /* argStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 , (DCvoidvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 , (DCboolvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 , (DCcharvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 , (DCshortvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 , (DCintvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 , (DClongvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 , (DClonglongvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 , (DCfloatvmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 , (DCdoublevmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 , (DCpointervmfunc*) &call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 , NULL /* callStruct */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203
8
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
204 DCCallVM_vt vt_arm64_variadic =
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
205 {
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
206 &deinit
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
207 , &reset
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
208 , &mode
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
209 , &var_bool
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
210 , &var_char
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
211 , &var_short
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
212 , &var_int
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
213 , &var_long
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
214 , &var_i64
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
215 , &var_float
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
216 , &var_double
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
217 , &var_pointer
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
218 , NULL /* argStruct */
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
219 , (DCvoidvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
220 , (DCboolvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
221 , (DCcharvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
222 , (DCshortvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
223 , (DCintvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
224 , (DClongvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
225 , (DClonglongvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
226 , (DCfloatvmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
227 , (DCdoublevmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
228 , (DCpointervmfunc*) &call
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
229 , NULL /* callStruct */
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
230 };
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
231
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
232 static void mode(DCCallVM* in_self, DCint mode)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 {
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
234 DCCallVM_arm64* self = (DCCallVM_arm64*)in_self;
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
235 DCCallVM_vt* vt;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
236
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237 switch(mode) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 case DC_CALL_C_DEFAULT:
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
239 case DC_CALL_C_ARM64:
8
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
240 case DC_CALL_C_ELLIPSIS:
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
241 vt = &vt_arm64;
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
242 break;
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
243 case DC_CALL_C_ELLIPSIS_VARARGS:
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
244 vt = &vt_arm64_variadic;
d2a8d50a59b6 added callvm for varargs
Daniel Adler
parents: 0
diff changeset
245 break;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
246 default:
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
247 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
248 return;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
249 }
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
250 dc_callvm_base_init(&self->mInterface, vt);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
251 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
252
84
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
253 /* Public API. */
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
254 DCCallVM* dcNewCallVM(DCsize size)
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
255 {
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
256 DCCallVM_arm64* p = (DCCallVM_arm64*)dcAllocMem(sizeof(DCCallVM_arm64)+size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
257
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
258 mode((DCCallVM*)p, DC_CALL_C_DEFAULT);
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
259
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
260 dcVecInit(&p->mVecHead, size);
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
261 reset((DCCallVM*)p);
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
262
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
263 return (DCCallVM*)p;
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
264 }
67961454902b - bigger cleanup in callvm code
cslag
parents: 12
diff changeset
265