~ubuntu-branches/debian/squeeze/ffcall/squeeze

« back to all changes in this revision

Viewing changes to vacall/vacall-sparc64.c

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Egger
  • Date: 2010-06-26 15:29:30 UTC
  • mfrom: (5.1.1 experimental)
  • Revision ID: james.westby@ubuntu.com-20100626152930-c09y01gk3szcnykn
Tags: 1.10+cvs20100619-2
Ship to unstable

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* vacall function for sparc64 CPU */
 
2
 
 
3
/*
 
4
 * Copyright 1995-2005 Bruno Haible, <bruno@clisp.org>
 
5
 *
 
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,
 
9
 * on this software.
 
10
 */
 
11
 
 
12
#ifndef REENTRANT
 
13
#include "vacall.h.in"
 
14
#else /* REENTRANT */
 
15
#include "vacall_r.h.in"
 
16
#endif
 
17
 
 
18
#ifdef REENTRANT
 
19
#define __vacall __vacall_r
 
20
register struct { void (*vacall_function) (void*,va_alist); void* arg; }
 
21
         *      env     __asm__("%g5");
 
22
#endif
 
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 */
 
65
 
 
66
void /* the return type is variable, not void! */
 
67
__vacall (__vaword word1, __vaword word2, __vaword word3, __vaword word4,
 
68
          __vaword word5, __vaword word6,
 
69
          __vaword firstword)
 
70
{
 
71
  __va_alist list;
 
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;
 
79
  list.darg[0] = darg0;
 
80
  list.darg[1] = darg1;
 
81
  list.darg[2] = darg2;
 
82
  list.darg[3] = darg3;
 
83
  list.darg[4] = darg4;
 
84
  list.darg[5] = darg5;
 
85
  list.darg[6] = darg6;
 
86
  list.darg[7] = darg7;
 
87
  list.darg[8] = darg8;
 
88
  list.darg[9] = darg9;
 
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;
 
95
  list.farg[0] = farg0;
 
96
  list.farg[1] = farg1;
 
97
  list.farg[2] = farg2;
 
98
  list.farg[3] = farg3;
 
99
  list.farg[4] = farg4;
 
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. */
 
112
  list.flags = 0;
 
113
  list.aptr = (long)(&firstword - 6);
 
114
  list.raddr = (void*)0;
 
115
  list.rtype = __VAvoid;
 
116
  list.anum = 0;
 
117
  /* Call vacall_function. The macros do all the rest. */
 
118
#ifndef REENTRANT
 
119
  (*vacall_function) (&list);
 
120
#else /* REENTRANT */
 
121
  (*env->vacall_function) (env->arg,&list);
 
122
#endif
 
123
  /* Put return value into proper register. */
 
124
  if (list.rtype == __VAvoid) {
 
125
  } else
 
126
  if (list.rtype == __VAchar) {
 
127
    iret = list.tmp._char;
 
128
  } else
 
129
  if (list.rtype == __VAschar) {
 
130
    iret = list.tmp._schar;
 
131
  } else
 
132
  if (list.rtype == __VAuchar) {
 
133
    iret = list.tmp._uchar;
 
134
  } else
 
135
  if (list.rtype == __VAshort) {
 
136
    iret = list.tmp._short;
 
137
  } else
 
138
  if (list.rtype == __VAushort) {
 
139
    iret = list.tmp._ushort;
 
140
  } else
 
141
  if (list.rtype == __VAint) {
 
142
    iret = list.tmp._int;
 
143
  } else
 
144
  if (list.rtype == __VAuint) {
 
145
    iret = list.tmp._uint;
 
146
  } else
 
147
  if (list.rtype == __VAlong) {
 
148
    iret = list.tmp._long;
 
149
  } else
 
150
  if (list.rtype == __VAulong) {
 
151
    iret = list.tmp._ulong;
 
152
  } else
 
153
  if (list.rtype == __VAlonglong) {
 
154
    iret = list.tmp._long;
 
155
  } else
 
156
  if (list.rtype == __VAulonglong) {
 
157
    iret = list.tmp._ulong;
 
158
  } else
 
159
  if (list.rtype == __VAfloat) {
 
160
    fret = list.tmp._float;
 
161
  } else
 
162
  if (list.rtype == __VAdouble) {
 
163
    dret = list.tmp._double;
 
164
  } else
 
165
  if (list.rtype == __VAvoidp) {
 
166
    iret = (long)list.tmp._ptr;
 
167
  } else
 
168
  if (list.rtype == __VAstruct) {
 
169
    if (list.flags & __VA_PCC_STRUCT_RETURN) {
 
170
      /* pcc struct return convention */
 
171
      iret = (long) list.raddr;
 
172
    } else {
 
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;
 
179
          } else
 
180
          if (list.rsize == 2) {
 
181
            iret =  ((__vaword)((unsigned char *) list.raddr)[0] << 56)
 
182
                  | ((__vaword)((unsigned char *) list.raddr)[1] << 48);
 
183
          } else
 
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);
 
188
          } else
 
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);
 
194
          } else
 
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);
 
201
          } else
 
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);
 
209
          } else
 
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);
 
218
          } else
 
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) {
 
229
            } else
 
230
            if (list.rsize == 9) {
 
231
              o1 =   (__vaword)((unsigned char *) list.raddr)[8] << 56;
 
232
            } else
 
233
            if (list.rsize == 10) {
 
234
              o1 =  ((__vaword)((unsigned char *) list.raddr)[8] << 56)
 
235
                  | ((__vaword)((unsigned char *) list.raddr)[9] << 48);
 
236
            } else
 
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);
 
241
            } else
 
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);
 
247
            } else
 
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);
 
254
            } else
 
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);
 
262
            } else
 
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);
 
271
            } else
 
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) {
 
282
              } else
 
283
              if (list.rsize == 17) {
 
284
                o2 =   (__vaword)((unsigned char *) list.raddr)[16] << 56;
 
285
              } else
 
286
              if (list.rsize == 18) {
 
287
                o2 =  ((__vaword)((unsigned char *) list.raddr)[16] << 56)
 
288
                    | ((__vaword)((unsigned char *) list.raddr)[17] << 48);
 
289
              } else
 
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);
 
294
              } else
 
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);
 
300
              } else
 
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);
 
307
              } else
 
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);
 
315
              } else
 
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);
 
324
              } else
 
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) {
 
335
                } else
 
336
                if (list.rsize == 25) {
 
337
                  o3 =   (__vaword)((unsigned char *) list.raddr)[24] << 56;
 
338
                } else
 
339
                if (list.rsize == 26) {
 
340
                  o3 =  ((__vaword)((unsigned char *) list.raddr)[24] << 56)
 
341
                      | ((__vaword)((unsigned char *) list.raddr)[25] << 48);
 
342
                } else
 
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);
 
347
                } else
 
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);
 
353
                } else
 
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);
 
360
                } else
 
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);
 
368
                } else
 
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);
 
377
                } else
 
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];
 
387
                }
 
388
              }
 
389
            }
 
390
          }
 
391
        }
 
392
      }
 
393
    }
 
394
  }
 
395
}