1/* GNU C varargs support for the Intel 80960.  */
2
3/* Define __gnuc_va_list.  */
4
5#ifndef __GNUC_VA_LIST
6#define __GNUC_VA_LIST
7/* The first element is the address of the first argument.
8   The second element is the number of bytes skipped past so far.  */
9typedef unsigned __gnuc_va_list[2];
10#endif /* not __GNUC_VA_LIST */
11
12/* If this is for internal libc use, don't define anything but
13   __gnuc_va_list.  */
14#if defined (_STDARG_H) || defined (_VARARGS_H)
15
16/* In GCC version 2, we want an ellipsis at the end of the declaration
17   of the argument list.  GCC version 1 can't parse it.  */
18
19#if __GNUC__ > 1
20#define __va_ellipsis ...
21#else
22#define __va_ellipsis
23#endif
24
25/* The stack size of the type t.  */
26#define __vsiz(T)   (((sizeof (T) + 3) / 4) * 4)
27/* The stack alignment of the type t.  */
28#define __vali(T)   (__alignof__ (T) >= 4 ? __alignof__ (T) : 4)
29/* The offset of the next stack argument after one of type t at offset i.  */
30#define __vpad(I, T) ((((I) + __vali (T) - 1) / __vali (T)) \
31		       * __vali (T) + __vsiz (T))
32
33/* Avoid errors if compiling GCC v2 with GCC v1.  */
34#if __GNUC__ == 1
35#define __extension__
36#endif
37
38#ifdef _STDARG_H
39/* Call __builtin_next_arg even though we aren't using its value, so that
40   we can verify that firstarg is correct.  */
41#define va_start(AP, LASTARG)				\
42__extension__						\
43({ __builtin_next_arg (LASTARG);			\
44   __asm__ ("st	g14,%0" : "=m" (*(AP)));		\
45   (AP)[1] = (__builtin_args_info (0) + __builtin_args_info (1)) * 4; })
46
47#else
48
49#define	va_alist __builtin_va_alist
50#define	va_dcl	 char *__builtin_va_alist; __va_ellipsis
51#define	va_start(AP) \
52__extension__						\
53({ __asm__ ("st	g14,%0" : "=m" (*(AP)));		\
54   (AP)[1] = (__builtin_args_info (0) + __builtin_args_info (1)) * 4; })
55#endif
56
57/* We cast to void * and then to TYPE * because this avoids
58   a warning about increasing the alignment requirement.  */
59#define	va_arg(AP, T)							\
60(									\
61  (									\
62    ((AP)[1] <= 48 && (__vpad ((AP)[1], T) > 48 || __vsiz (T) > 16))	\
63      ? ((AP)[1] = 48 + __vsiz (T))					\
64      : ((AP)[1] = __vpad ((AP)[1], T))					\
65  ),									\
66									\
67  *((T *) (void *) ((char *) *(AP) + (AP)[1] - __vsiz (T)))		\
68)
69
70#ifndef va_end
71void va_end (__gnuc_va_list);		/* Defined in libgcc.a */
72#endif
73#define	va_end(AP)	((void) 0)
74
75/* Copy __gnuc_va_list into another variable of this type.  */
76#define __va_copy(dest, src) (dest) = (src)
77
78#endif /* defined (_STDARG_H) || defined (_VARARGS_H) */
79
80