Initial revision
[official-gcc.git] / gcc / ginclude / va-i860.h
blob56d2c7fe1d3b7b2452cf56a40ab2f81b2c92b6a0
1 /* Note: We must use the name __builtin_savregs. GCC attaches special
2 significance to that name. In particular, regardless of where in a
3 function __builtin_saveregs is called, GCC moves the call up to the
4 very start of the function. */
7 /* Define __gnuc_va_list. */
9 #ifndef __GNUC_VA_LIST
10 #define __GNUC_VA_LIST
12 typedef union {
13 float __freg[8];
14 double __dreg[4];
15 } __f_regs;
17 typedef struct {
18 #if defined (__SVR4__) || defined (__svr4__) || defined (__alliant__) || defined (__PARAGON__)
19 __f_regs __float_regs; long __ireg[12];
20 #else /* pre-SVR4 */
21 long __ireg[12]; __f_regs __float_regs;
22 #endif
23 } __va_saved_regs;
25 typedef struct {
26 #if defined(__SVR4__) || defined(__svr4__) || defined(__alliant__) || defined (__PARAGON__)
27 unsigned __ireg_used; /* How many int regs consumed 'til now? */
28 unsigned __freg_used; /* How many flt regs consumed 'til now? */
29 long *__reg_base; /* Address of where we stored the regs. */
30 long * __mem_ptr; /* Address of memory overflow args area. */
31 #else /* pre-SVR4 */
32 long *__reg_base; /* Address of where we stored the regs. */
33 long * __mem_ptr; /* Address of memory overflow args area. */
34 unsigned __ireg_used; /* How many int regs consumed 'til now? */
35 unsigned __freg_used; /* How many flt regs consumed 'til now? */
36 #endif
37 } __gnuc_va_list;
38 #endif /* not __GNUC_VA_LIST */
40 /* If this is for internal libc use, don't define anything but
41 __gnuc_va_list. */
42 #if defined (_STDARG_H) || defined (_VARARGS_H)
44 #if !defined(_STDARG_H)
46 /* varargs support */
47 #define va_alist __builtin_va_alist
48 #if defined (__PARAGON__)
49 #define va_dcl int va_alist;
50 #else /* __PARAGON__ */
51 #define va_dcl
52 #endif /* __PARAGON__ */
53 #define va_start(pvar) ((pvar) = * (__gnuc_va_list *) __builtin_saveregs ())
55 #else /* STDARG.H */
57 /* ANSI alternative. */
58 /* Note that CUMULATIVE_ARGS elements are measured in bytes on the i860,
59 so we divide by 4 to get # of registers. */
60 #define va_start(pvar, firstarg) \
61 ((pvar) = *(__gnuc_va_list *) __builtin_saveregs (), \
62 (pvar).__ireg_used = __builtin_args_info (0) / 4, \
63 (pvar).__freg_used = __builtin_args_info (1) / 4, \
64 (pvar).__mem_ptr = __builtin_next_arg (firstarg))
66 #endif /* _STDARG_H */
68 /* Values returned by __builtin_classify_type. */
70 #ifndef va_end
71 enum {
72 __no_type_class = -1,
73 __void_type_class,
74 __integer_type_class,
75 __char_type_class,
76 __enumeral_type_class,
77 __boolean_type_class,
78 __pointer_type_class,
79 __reference_type_class,
80 __offset_type_class,
81 __real_type_class,
82 __complex_type_class,
83 __function_type_class,
84 __method_type_class,
85 __record_type_class,
86 __union_type_class,
87 __array_type_class,
88 __string_type_class,
89 __set_type_class,
90 __file_type_class,
91 __lang_type_class
94 void va_end (__gnuc_va_list); /* Defined in libgcc.a */
95 #endif
96 #define va_end(__va) ((void) 0)
98 #define __NUM_PARM_FREGS 8
99 #define __NUM_PARM_IREGS 12
101 #define __savereg(__va) ((__va_saved_regs *) ((__va).__reg_base))
103 /* This macro works both for SVR4 and pre-SVR4 environments. */
105 /* Note that parameters are always aligned at least to a word boundary
106 (when passed) regardless of what GCC's __alignof__ operator says. */
108 /* Make allowances here for adding 128-bit (long double) floats someday. */
110 #if 0 /* What was this for? */
111 #ifndef __GNU_VA_LIST
112 #define __ireg_used ireg_used
113 #define __freg_used freg_used
114 #define __mem_ptr mem_ptr
115 #define __reg_base reg_base
116 #endif
117 #endif /* 0 */
119 /* Avoid errors if compiling GCC v2 with GCC v1. */
120 #if __GNUC__ == 1
121 #define __extension__
122 #endif
124 #define va_arg(__va, __type) \
125 __extension__ \
126 (* (__type *) \
127 ({ \
128 register void *__rv; /* result value */ \
129 register unsigned __align; \
130 switch (__builtin_classify_type (* (__type *) 0)) \
132 case __real_type_class: \
133 switch (sizeof (__type)) \
135 case sizeof (float): \
136 case sizeof (double): \
137 if ((__va).__freg_used < __NUM_PARM_FREGS - 1) \
139 if (((__va).__freg_used & 1) != 0) \
140 (__va).__freg_used++; /* skip odd */ \
141 __rv = &__savereg((__va))->__float_regs.__freg[(__va).__freg_used];\
142 (__va).__freg_used += 2; \
144 else \
146 if ((((unsigned) (__va).__mem_ptr) & (sizeof(double)-1)) != 0) \
147 (__va).__mem_ptr++; /* skip odd */ \
148 __rv = (__va).__mem_ptr; \
149 (__va).__mem_ptr += 2; \
151 if (sizeof (__type) == sizeof (float)) \
153 *((float *) __rv) = *((double *) __rv); \
154 *(((long *) __rv) + 1) = 0xfff00001; \
156 break; \
157 default: \
158 abort (); \
160 break; \
161 case __void_type_class: \
162 case __integer_type_class: \
163 case __char_type_class: \
164 case __enumeral_type_class: \
165 case __boolean_type_class: \
166 case __pointer_type_class: \
167 case __reference_type_class: \
168 case __offset_type_class: \
169 if (sizeof (__type) <= 4) \
171 __rv = ((__va).__ireg_used < __NUM_PARM_IREGS \
172 ? (&__savereg((__va))->__ireg[(__va).__ireg_used++]) \
173 : (__va).__mem_ptr++); \
174 break; \
176 else if ((__va).__ireg_used + sizeof (__type) / 4 <= __NUM_PARM_IREGS) \
178 __rv = &__savereg((__va))->__ireg[(__va).__ireg_used]; \
179 (__va).__ireg_used += sizeof (__type) / 4; \
180 break; \
182 /* Fall through to fetch from memory. */ \
183 case __record_type_class: \
184 case __union_type_class: \
185 __align = (__alignof__ (__type) < sizeof (long) \
186 ? sizeof (long) \
187 : __alignof__ (__type)); \
188 (__va).__mem_ptr \
189 = (long *) \
190 ((((unsigned) (__va).__mem_ptr) + (__align-1)) & ~(__align-1)); \
191 __rv = (__va).__mem_ptr; \
192 (__va).__mem_ptr \
193 += ((sizeof (__type) + sizeof (long) - 1) / sizeof (long)); \
194 break; \
195 case __complex_type_class: \
196 case __function_type_class: \
197 case __method_type_class: \
198 case __array_type_class: \
199 case __string_type_class: \
200 case __set_type_class: \
201 case __file_type_class: \
202 case __lang_type_class: \
203 case __no_type_class: \
204 default: \
205 abort (); \
207 __rv; \
210 /* Copy __gnuc_va_list into another variable of this type. */
211 #define __va_copy(dest, src) (dest) = (src)
213 #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */