Expand PMF_FN_* macros.
[netbsd-mini2440.git] / sys / arch / sparc / include / stdarg.h
blob877bbfc82d8ab74dfdbeeed3f8d0a7e0817ceb7d
1 /* $NetBSD: stdarg.h,v 1.19.2.5 2005/11/10 13:58:56 skrll Exp $ */
3 /*
4 * Copyright (c) 1992, 1993
5 * The Regents of the University of California. All rights reserved.
7 * This software was developed by the Computer Systems Engineering group
8 * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
9 * contributed to Berkeley.
11 * All advertising materials mentioning features or use of this software
12 * must display the following acknowledgement:
13 * This product includes software developed by the University of
14 * California, Lawrence Berkeley Laboratory.
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
18 * are met:
19 * 1. Redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer.
21 * 2. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution.
24 * 3. Neither the name of the University nor the names of its contributors
25 * may be used to endorse or promote products derived from this software
26 * without specific prior written permission.
28 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
29 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
30 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
31 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
38 * SUCH DAMAGE.
40 * from: @(#)stdarg.h 8.2 (Berkeley) 9/27/93
43 #ifndef _SPARC_STDARG_H_
44 #define _SPARC_STDARG_H_
46 #include <machine/ansi.h>
47 #include <sys/featuretest.h>
49 typedef _BSD_VA_LIST_ va_list;
51 #ifdef __lint__
53 # define va_start(ap, last) ((ap) = *(va_list *)0)
54 # define va_arg(ap, type) (*(type *)(void *)&(ap))
55 # define va_end(ap)
56 # define __va_copy(dest, src) ((dest) = (src))
58 #elif __GNUC_PREREQ__(3,0)
60 # define va_start(ap, last) __builtin_va_start(ap, last)
61 # define va_end(ap) __builtin_va_end(ap)
62 # define va_arg(ap, type) __builtin_va_arg(ap, type)
63 # define __va_copy(dst, src) __builtin_va_copy(dst, src)
65 #else
67 # define va_start(ap, last) \
68 (void)(__builtin_next_arg(last), (ap) = (va_list)__builtin_saveregs())
71 # define va_end(ap)
72 # define __va_copy(dest, src) \
73 ((dest) = (src))
75 # ifdef __arch64__
77 * For sparcv9 code.
79 # define __va_arg8(ap, type) \
80 (*(type *)(void *)((ap) += 8, (ap) - 8))
81 # define __va_arg16(ap, type) \
82 (*(type *)(void *)((ap) = (va_list)(((unsigned long)(ap) + 31) & -16),\
83 (ap) - 16))
84 # define __va_int(ap, type) \
85 (*(type *)(void *)((ap) += 8, (ap) - sizeof(type)))
87 # define __REAL_TYPE_CLASS 8
88 # define __RECORD_TYPE_CLASS 12
89 # define va_arg(ap, type) \
90 (__builtin_classify_type(*(type *)0) == __REAL_TYPE_CLASS ? \
91 (__alignof__(type) == 16 ? __va_arg16(ap, type) : \
92 __va_arg8(ap, type)) : \
93 (__builtin_classify_type(*(type *)0) < __RECORD_TYPE_CLASS ? \
94 __va_int(ap, type) : \
95 (sizeof(type) <= 8 ? __va_arg8(ap, type) : \
96 (sizeof(type) <= 16 ? __va_arg16(ap, type) : \
97 *__va_arg8(ap, type *)))))
98 # else /* __arch64__ */
99 /*
100 * For sparcv8 code.
102 # define __va_size(type) \
103 (((sizeof(type) + sizeof(long) - 1) / sizeof(long)) * sizeof(long))
106 * va_arg picks up the next argument of type `type'. Appending an
107 * asterisk to `type' must produce a pointer to `type' (i.e., `type'
108 * may not be, e.g., `int (*)()').
110 * Gcc-2.x tries to use ldd/std for double and quad_t values, but Sun's
111 * brain-damaged calling convention does not quad-align these. Thus, for
112 * 8-byte arguments, we have to pick up the actual value four bytes at a
113 * time, and use type punning (i.e., a union) to produce the result.
114 * (We could also do this with a libc function, actually, by returning
115 * 8 byte integers in %o0+%o1 and the same 8 bytes as a double in %f0+%f1.)
117 * Note: We don't declare __d with type `type', since in C++ the type might
118 * have a constructor.
121 # define __va_8byte(ap, type) \
122 __extension__ ({ \
123 union { char __d[sizeof(type)]; int __i[2]; } __va_u; \
124 __va_u.__i[0] = ((int *)(void *)(ap))[0]; \
125 __va_u.__i[1] = ((int *)(void *)(ap))[1]; \
126 (ap) += 8; *(type *)(va_list)__va_u.__d; \
129 # define __va_arg(ap, type) \
130 (*(type *)((ap) += __va_size(type), \
131 (ap) - (sizeof(type) < sizeof(long) && \
132 sizeof(type) != __va_size(type) ? \
133 sizeof(type) : __va_size(type))))
135 # define __RECORD_TYPE_CLASS 12
136 # define va_arg(ap, type) \
137 (__builtin_classify_type(*(type *)0) >= __RECORD_TYPE_CLASS ? \
138 *__va_arg(ap, type *) : __va_size(type) == 8 ? \
139 __va_8byte(ap, type) : __va_arg(ap, type))
141 # endif /* __arch64__ */
142 #endif /* !__GNUC_PREREQ(3, 0) */
144 #if !defined(_ANSI_SOURCE) && \
145 (defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) >= 199901L || \
146 defined(_NETBSD_SOURCE))
147 # define va_copy(dst, src) __va_copy(dst, src)
148 #endif
150 #endif /* !_SPARC_STDARG_H_ */