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

« back to all changes in this revision

Viewing changes to ffcall/callback/vacall_r/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
 
}