1
/* vacall function for sparc64 CPU */
4
* Copyright 1995-2005 Bruno Haible, <bruno@clisp.org>
6
* This is free software distributed under the GNU General Public Licence
7
* described in the file COPYING. Contact the author if you don't have this
8
* or can't live with it. There is ABSOLUTELY NO WARRANTY, explicit or implied,
13
#include "vacall.h.in"
15
#include "vacall_r.h.in"
19
#define __vacall __vacall_r
20
register struct { void (*vacall_function) (void*,va_alist); void* arg; }
23
register __vaword* fp __asm__("%fp"); /* our %fp, caller's %sp */
24
register __vaword* ret __asm__("%i7"); /* %i7+8 = return address */
25
register float farg0 __asm__("%f1");
26
register float farg1 __asm__("%f3");
27
register float farg2 __asm__("%f5");
28
register float farg3 __asm__("%f7");
29
register float farg4 __asm__("%f9");
30
register float farg5 __asm__("%f11");
31
register float farg6 __asm__("%f13");
32
register float farg7 __asm__("%f15");
33
register float farg8 __asm__("%f17");
34
register float farg9 __asm__("%f19");
35
register float farg10 __asm__("%f21");
36
register float farg11 __asm__("%f23");
37
register float farg12 __asm__("%f25");
38
register float farg13 __asm__("%f27");
39
register float farg14 __asm__("%f29");
40
register float farg15 __asm__("%f31");
41
register double darg0 __asm__("%f0");
42
register double darg1 __asm__("%f2");
43
register double darg2 __asm__("%f4");
44
register double darg3 __asm__("%f6");
45
register double darg4 __asm__("%f8");
46
register double darg5 __asm__("%f10");
47
register double darg6 __asm__("%f12");
48
register double darg7 __asm__("%f14");
49
register double darg8 __asm__("%f16");
50
register double darg9 __asm__("%f18");
51
register double darg10 __asm__("%f20");
52
register double darg11 __asm__("%f22");
53
register double darg12 __asm__("%f24");
54
register double darg13 __asm__("%f26");
55
register double darg14 __asm__("%f28");
56
register double darg15 __asm__("%f30");
57
register __vaword iret __asm__("%i0");
58
register __vaword o1 __asm__("%i1");
59
register __vaword o2 __asm__("%i2");
60
register __vaword o3 __asm__("%i3");
61
register __vaword o4 __asm__("%i4");
62
register __vaword o5 __asm__("%i5");
63
register float fret __asm__("%f0"); /* %f0 */
64
register double dret __asm__("%f0"); /* %f0,%f1 */
66
void /* the return type is variable, not void! */
67
__vacall (__vaword word1, __vaword word2, __vaword word3, __vaword word4,
68
__vaword word5, __vaword word6,
72
/* Move the arguments passed in registers to their stack locations. */
73
(&firstword)[-6] = word1;
74
(&firstword)[-5] = word2;
75
(&firstword)[-4] = word3;
76
(&firstword)[-3] = word4;
77
(&firstword)[-2] = word5;
78
(&firstword)[-1] = word6;
89
list.darg[10] = darg10;
90
list.darg[11] = darg11;
91
list.darg[12] = darg12;
92
list.darg[13] = darg13;
93
list.darg[14] = darg14;
94
list.darg[15] = darg15;
100
list.farg[5] = farg5;
101
list.farg[6] = farg6;
102
list.farg[7] = farg7;
103
list.farg[8] = farg8;
104
list.farg[9] = farg9;
105
list.farg[10] = farg10;
106
list.farg[11] = farg11;
107
list.farg[12] = farg12;
108
list.farg[13] = farg13;
109
list.farg[14] = farg14;
110
list.farg[15] = farg15;
111
/* Prepare the va_alist. */
113
list.aptr = (long)(&firstword - 6);
114
list.raddr = (void*)0;
115
list.rtype = __VAvoid;
117
/* Call vacall_function. The macros do all the rest. */
119
(*vacall_function) (&list);
120
#else /* REENTRANT */
121
(*env->vacall_function) (env->arg,&list);
123
/* Put return value into proper register. */
124
if (list.rtype == __VAvoid) {
126
if (list.rtype == __VAchar) {
127
iret = list.tmp._char;
129
if (list.rtype == __VAschar) {
130
iret = list.tmp._schar;
132
if (list.rtype == __VAuchar) {
133
iret = list.tmp._uchar;
135
if (list.rtype == __VAshort) {
136
iret = list.tmp._short;
138
if (list.rtype == __VAushort) {
139
iret = list.tmp._ushort;
141
if (list.rtype == __VAint) {
142
iret = list.tmp._int;
144
if (list.rtype == __VAuint) {
145
iret = list.tmp._uint;
147
if (list.rtype == __VAlong) {
148
iret = list.tmp._long;
150
if (list.rtype == __VAulong) {
151
iret = list.tmp._ulong;
153
if (list.rtype == __VAlonglong) {
154
iret = list.tmp._long;
156
if (list.rtype == __VAulonglong) {
157
iret = list.tmp._ulong;
159
if (list.rtype == __VAfloat) {
160
fret = list.tmp._float;
162
if (list.rtype == __VAdouble) {
163
dret = list.tmp._double;
165
if (list.rtype == __VAvoidp) {
166
iret = (long)list.tmp._ptr;
168
if (list.rtype == __VAstruct) {
169
if (list.flags & __VA_PCC_STRUCT_RETURN) {
170
/* pcc struct return convention */
171
iret = (long) list.raddr;
173
/* normal struct return convention */
174
if (list.flags & __VA_REGISTER_STRUCT_RETURN) {
175
/* Return structs of size <= 32 in registers. */
176
if (list.rsize > 0 && list.rsize <= 32) {
177
if (list.rsize == 1) {
178
iret = (__vaword)((unsigned char *) list.raddr)[0] << 56;
180
if (list.rsize == 2) {
181
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
182
| ((__vaword)((unsigned char *) list.raddr)[1] << 48);
184
if (list.rsize == 3) {
185
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
186
| ((__vaword)((unsigned char *) list.raddr)[1] << 48)
187
| ((__vaword)((unsigned char *) list.raddr)[2] << 40);
189
if (list.rsize == 4) {
190
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
191
| ((__vaword)((unsigned char *) list.raddr)[1] << 48)
192
| ((__vaword)((unsigned char *) list.raddr)[2] << 40)
193
| ((__vaword)((unsigned char *) list.raddr)[3] << 32);
195
if (list.rsize == 5) {
196
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
197
| ((__vaword)((unsigned char *) list.raddr)[1] << 48)
198
| ((__vaword)((unsigned char *) list.raddr)[2] << 40)
199
| ((__vaword)((unsigned char *) list.raddr)[3] << 32)
200
| ((__vaword)((unsigned char *) list.raddr)[4] << 24);
202
if (list.rsize == 6) {
203
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
204
| ((__vaword)((unsigned char *) list.raddr)[1] << 48)
205
| ((__vaword)((unsigned char *) list.raddr)[2] << 40)
206
| ((__vaword)((unsigned char *) list.raddr)[3] << 32)
207
| ((__vaword)((unsigned char *) list.raddr)[4] << 24)
208
| ((__vaword)((unsigned char *) list.raddr)[5] << 16);
210
if (list.rsize == 7) {
211
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
212
| ((__vaword)((unsigned char *) list.raddr)[1] << 48)
213
| ((__vaword)((unsigned char *) list.raddr)[2] << 40)
214
| ((__vaword)((unsigned char *) list.raddr)[3] << 32)
215
| ((__vaword)((unsigned char *) list.raddr)[4] << 24)
216
| ((__vaword)((unsigned char *) list.raddr)[5] << 16)
217
| ((__vaword)((unsigned char *) list.raddr)[6] << 8);
219
if (list.rsize >= 8 && list.rsize <= 32) {
220
iret = ((__vaword)((unsigned char *) list.raddr)[0] << 56)
221
| ((__vaword)((unsigned char *) list.raddr)[1] << 48)
222
| ((__vaword)((unsigned char *) list.raddr)[2] << 40)
223
| ((__vaword)((unsigned char *) list.raddr)[3] << 32)
224
| ((__vaword)((unsigned char *) list.raddr)[4] << 24)
225
| ((__vaword)((unsigned char *) list.raddr)[5] << 16)
226
| ((__vaword)((unsigned char *) list.raddr)[6] << 8)
227
| (__vaword)((unsigned char *) list.raddr)[7];
228
if (list.rsize == 8) {
230
if (list.rsize == 9) {
231
o1 = (__vaword)((unsigned char *) list.raddr)[8] << 56;
233
if (list.rsize == 10) {
234
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
235
| ((__vaword)((unsigned char *) list.raddr)[9] << 48);
237
if (list.rsize == 11) {
238
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
239
| ((__vaword)((unsigned char *) list.raddr)[9] << 48)
240
| ((__vaword)((unsigned char *) list.raddr)[10] << 40);
242
if (list.rsize == 12) {
243
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
244
| ((__vaword)((unsigned char *) list.raddr)[9] << 48)
245
| ((__vaword)((unsigned char *) list.raddr)[10] << 40)
246
| ((__vaword)((unsigned char *) list.raddr)[11] << 32);
248
if (list.rsize == 13) {
249
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
250
| ((__vaword)((unsigned char *) list.raddr)[9] << 48)
251
| ((__vaword)((unsigned char *) list.raddr)[10] << 40)
252
| ((__vaword)((unsigned char *) list.raddr)[11] << 32)
253
| ((__vaword)((unsigned char *) list.raddr)[12] << 24);
255
if (list.rsize == 14) {
256
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
257
| ((__vaword)((unsigned char *) list.raddr)[9] << 48)
258
| ((__vaword)((unsigned char *) list.raddr)[10] << 40)
259
| ((__vaword)((unsigned char *) list.raddr)[11] << 32)
260
| ((__vaword)((unsigned char *) list.raddr)[12] << 24)
261
| ((__vaword)((unsigned char *) list.raddr)[13] << 16);
263
if (list.rsize == 15) {
264
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
265
| ((__vaword)((unsigned char *) list.raddr)[9] << 48)
266
| ((__vaword)((unsigned char *) list.raddr)[10] << 40)
267
| ((__vaword)((unsigned char *) list.raddr)[11] << 32)
268
| ((__vaword)((unsigned char *) list.raddr)[12] << 24)
269
| ((__vaword)((unsigned char *) list.raddr)[13] << 16)
270
| ((__vaword)((unsigned char *) list.raddr)[14] << 8);
272
if (list.rsize >= 16 && list.rsize <= 32) {
273
o1 = ((__vaword)((unsigned char *) list.raddr)[8] << 56)
274
| ((__vaword)((unsigned char *) list.raddr)[9] << 48)
275
| ((__vaword)((unsigned char *) list.raddr)[10] << 40)
276
| ((__vaword)((unsigned char *) list.raddr)[11] << 32)
277
| ((__vaword)((unsigned char *) list.raddr)[12] << 24)
278
| ((__vaword)((unsigned char *) list.raddr)[13] << 16)
279
| ((__vaword)((unsigned char *) list.raddr)[14] << 8)
280
| (__vaword)((unsigned char *) list.raddr)[15];
281
if (list.rsize == 16) {
283
if (list.rsize == 17) {
284
o2 = (__vaword)((unsigned char *) list.raddr)[16] << 56;
286
if (list.rsize == 18) {
287
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
288
| ((__vaword)((unsigned char *) list.raddr)[17] << 48);
290
if (list.rsize == 19) {
291
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
292
| ((__vaword)((unsigned char *) list.raddr)[17] << 48)
293
| ((__vaword)((unsigned char *) list.raddr)[18] << 40);
295
if (list.rsize == 20) {
296
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
297
| ((__vaword)((unsigned char *) list.raddr)[17] << 48)
298
| ((__vaword)((unsigned char *) list.raddr)[18] << 40)
299
| ((__vaword)((unsigned char *) list.raddr)[19] << 32);
301
if (list.rsize == 21) {
302
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
303
| ((__vaword)((unsigned char *) list.raddr)[17] << 48)
304
| ((__vaword)((unsigned char *) list.raddr)[18] << 40)
305
| ((__vaword)((unsigned char *) list.raddr)[19] << 32)
306
| ((__vaword)((unsigned char *) list.raddr)[20] << 24);
308
if (list.rsize == 22) {
309
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
310
| ((__vaword)((unsigned char *) list.raddr)[17] << 48)
311
| ((__vaword)((unsigned char *) list.raddr)[18] << 40)
312
| ((__vaword)((unsigned char *) list.raddr)[19] << 32)
313
| ((__vaword)((unsigned char *) list.raddr)[20] << 24)
314
| ((__vaword)((unsigned char *) list.raddr)[21] << 16);
316
if (list.rsize == 23) {
317
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
318
| ((__vaword)((unsigned char *) list.raddr)[17] << 48)
319
| ((__vaword)((unsigned char *) list.raddr)[18] << 40)
320
| ((__vaword)((unsigned char *) list.raddr)[19] << 32)
321
| ((__vaword)((unsigned char *) list.raddr)[20] << 24)
322
| ((__vaword)((unsigned char *) list.raddr)[21] << 16)
323
| ((__vaword)((unsigned char *) list.raddr)[22] << 8);
325
if (list.rsize >= 24 && list.rsize <= 32) {
326
o2 = ((__vaword)((unsigned char *) list.raddr)[16] << 56)
327
| ((__vaword)((unsigned char *) list.raddr)[17] << 48)
328
| ((__vaword)((unsigned char *) list.raddr)[18] << 40)
329
| ((__vaword)((unsigned char *) list.raddr)[19] << 32)
330
| ((__vaword)((unsigned char *) list.raddr)[20] << 24)
331
| ((__vaword)((unsigned char *) list.raddr)[21] << 16)
332
| ((__vaword)((unsigned char *) list.raddr)[22] << 8)
333
| (__vaword)((unsigned char *) list.raddr)[23];
334
if (list.rsize == 24) {
336
if (list.rsize == 25) {
337
o3 = (__vaword)((unsigned char *) list.raddr)[24] << 56;
339
if (list.rsize == 26) {
340
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
341
| ((__vaword)((unsigned char *) list.raddr)[25] << 48);
343
if (list.rsize == 27) {
344
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
345
| ((__vaword)((unsigned char *) list.raddr)[25] << 48)
346
| ((__vaword)((unsigned char *) list.raddr)[26] << 40);
348
if (list.rsize == 28) {
349
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
350
| ((__vaword)((unsigned char *) list.raddr)[25] << 48)
351
| ((__vaword)((unsigned char *) list.raddr)[26] << 40)
352
| ((__vaword)((unsigned char *) list.raddr)[27] << 32);
354
if (list.rsize == 29) {
355
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
356
| ((__vaword)((unsigned char *) list.raddr)[25] << 48)
357
| ((__vaword)((unsigned char *) list.raddr)[26] << 40)
358
| ((__vaword)((unsigned char *) list.raddr)[27] << 32)
359
| ((__vaword)((unsigned char *) list.raddr)[28] << 24);
361
if (list.rsize == 30) {
362
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
363
| ((__vaword)((unsigned char *) list.raddr)[25] << 48)
364
| ((__vaword)((unsigned char *) list.raddr)[26] << 40)
365
| ((__vaword)((unsigned char *) list.raddr)[27] << 32)
366
| ((__vaword)((unsigned char *) list.raddr)[28] << 24)
367
| ((__vaword)((unsigned char *) list.raddr)[29] << 16);
369
if (list.rsize == 31) {
370
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
371
| ((__vaword)((unsigned char *) list.raddr)[25] << 48)
372
| ((__vaword)((unsigned char *) list.raddr)[26] << 40)
373
| ((__vaword)((unsigned char *) list.raddr)[27] << 32)
374
| ((__vaword)((unsigned char *) list.raddr)[28] << 24)
375
| ((__vaword)((unsigned char *) list.raddr)[29] << 16)
376
| ((__vaword)((unsigned char *) list.raddr)[30] << 8);
378
if (list.rsize == 32) {
379
o3 = ((__vaword)((unsigned char *) list.raddr)[24] << 56)
380
| ((__vaword)((unsigned char *) list.raddr)[25] << 48)
381
| ((__vaword)((unsigned char *) list.raddr)[26] << 40)
382
| ((__vaword)((unsigned char *) list.raddr)[27] << 32)
383
| ((__vaword)((unsigned char *) list.raddr)[28] << 24)
384
| ((__vaword)((unsigned char *) list.raddr)[29] << 16)
385
| ((__vaword)((unsigned char *) list.raddr)[30] << 8)
386
| (__vaword)((unsigned char *) list.raddr)[31];