]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/doc/extend.texi
Finish committing moxie port
[thirdparty/gcc.git] / gcc / doc / extend.texi
CommitLineData
8d8da227 1@c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001,
66647d44
JJ
2@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
3@c Free Software Foundation, Inc.
9a8ce21f 4
c1f7febf
RK
5@c This is part of the GCC manual.
6@c For copying conditions, see the file gcc.texi.
7
8@node C Extensions
9@chapter Extensions to the C Language Family
10@cindex extensions, C language
11@cindex C language extensions
12
84330467 13@opindex pedantic
161d7b59 14GNU C provides several language features not found in ISO standard C@.
f0523f02 15(The @option{-pedantic} option directs GCC to print a warning message if
c1f7febf
RK
16any of these features is used.) To test for the availability of these
17features in conditional compilation, check for a predefined macro
161d7b59 18@code{__GNUC__}, which is always defined under GCC@.
c1f7febf 19
161d7b59 20These extensions are available in C and Objective-C@. Most of them are
c1f7febf
RK
21also available in C++. @xref{C++ Extensions,,Extensions to the
22C++ Language}, for extensions that apply @emph{only} to C++.
23
4b404517
JM
24Some features that are in ISO C99 but not C89 or C++ are also, as
25extensions, accepted by GCC in C89 mode and in C++.
5490d604 26
c1f7febf
RK
27@menu
28* Statement Exprs:: Putting statements and declarations inside expressions.
14e33ee8 29* Local Labels:: Labels local to a block.
c1f7febf
RK
30* Labels as Values:: Getting pointers to labels, and computed gotos.
31* Nested Functions:: As in Algol and Pascal, lexical scoping of functions.
6ccde948 32* Constructing Calls:: Dispatching a call to another function.
c1f7febf 33* Typeof:: @code{typeof}: referring to the type of an expression.
c1f7febf 34* Conditionals:: Omitting the middle operand of a @samp{?:} expression.
6ccde948 35* Long Long:: Double-word integers---@code{long long int}.
c1f7febf 36* Complex:: Data types for complex numbers.
c77cd3d1 37* Floating Types:: Additional Floating Types.
85a92f7e 38* Decimal Float:: Decimal Floating Types.
6f4d7222 39* Hex Floats:: Hexadecimal floating-point constants.
0f996086 40* Fixed-Point:: Fixed-Point Types.
c1f7febf
RK
41* Zero Length:: Zero-length arrays.
42* Variable Length:: Arrays whose length is computed at run time.
ba05abd3 43* Empty Structures:: Structures with no members.
6ccde948 44* Variadic Macros:: Macros with a variable number of arguments.
ccd96f0a 45* Escaped Newlines:: Slightly looser rules for escaped newlines.
c1f7febf
RK
46* Subscripting:: Any array can be subscripted, even if not an lvalue.
47* Pointer Arith:: Arithmetic on @code{void}-pointers and function pointers.
48* Initializers:: Non-constant initializers.
4b404517 49* Compound Literals:: Compound literals give structures, unions
6ccde948
RW
50 or arrays as values.
51* Designated Inits:: Labeling elements of initializers.
c1f7febf 52* Cast to Union:: Casting to union type from any member of the union.
6ccde948
RW
53* Case Ranges:: `case 1 ... 9' and such.
54* Mixed Declarations:: Mixing declarations and code.
c1f7febf 55* Function Attributes:: Declaring that functions have no side effects,
6ccde948 56 or that they can never return.
2c5e91d2 57* Attribute Syntax:: Formal syntax for attributes.
c1f7febf
RK
58* Function Prototypes:: Prototype declarations and old-style definitions.
59* C++ Comments:: C++ comments are recognized.
60* Dollar Signs:: Dollar sign is allowed in identifiers.
61* Character Escapes:: @samp{\e} stands for the character @key{ESC}.
6ccde948
RW
62* Variable Attributes:: Specifying attributes of variables.
63* Type Attributes:: Specifying attributes of types.
c1f7febf
RK
64* Alignment:: Inquiring about the alignment of a type or variable.
65* Inline:: Defining inline functions (as fast as macros).
66* Extended Asm:: Assembler instructions with C expressions as operands.
6ccde948 67 (With them you can define ``built-in'' functions.)
c1f7febf
RK
68* Constraints:: Constraints for asm operands
69* Asm Labels:: Specifying the assembler name to use for a C symbol.
70* Explicit Reg Vars:: Defining variables residing in specified registers.
71* Alternate Keywords:: @code{__const__}, @code{__asm__}, etc., for header files.
72* Incomplete Enums:: @code{enum foo;}, with details to follow.
6ccde948
RW
73* Function Names:: Printable strings which are the name of the current
74 function.
c1f7febf 75* Return Address:: Getting the return or frame address of a function.
1255c85c 76* Vector Extensions:: Using vector instructions through built-in functions.
7a3ea201 77* Offsetof:: Special syntax for implementing @code{offsetof}.
6ccde948 78* Atomic Builtins:: Built-in functions for atomic memory access.
10a0d495
JJ
79* Object Size Checking:: Built-in functions for limited buffer overflow
80 checking.
c5c76735 81* Other Builtins:: Other built-in functions.
0975678f 82* Target Builtins:: Built-in functions specific to particular targets.
a2bec818 83* Target Format Checks:: Format checks specific to particular targets.
0168a849 84* Pragmas:: Pragmas accepted by GCC.
b11cc610 85* Unnamed Fields:: Unnamed struct/union fields within structs/unions.
3d78f2e9 86* Thread-Local:: Per-thread variables.
f7fd775f 87* Binary constants:: Binary constants using the @samp{0b} prefix.
c1f7febf 88@end menu
c1f7febf
RK
89
90@node Statement Exprs
91@section Statements and Declarations in Expressions
92@cindex statements inside expressions
93@cindex declarations inside expressions
94@cindex expressions containing statements
95@cindex macros, statements in expressions
96
97@c the above section title wrapped and causes an underfull hbox.. i
98@c changed it from "within" to "in". --mew 4feb93
c1f7febf 99A compound statement enclosed in parentheses may appear as an expression
161d7b59 100in GNU C@. This allows you to use loops, switches, and local variables
c1f7febf
RK
101within an expression.
102
103Recall that a compound statement is a sequence of statements surrounded
104by braces; in this construct, parentheses go around the braces. For
105example:
106
3ab51846 107@smallexample
c1f7febf
RK
108(@{ int y = foo (); int z;
109 if (y > 0) z = y;
110 else z = - y;
111 z; @})
3ab51846 112@end smallexample
c1f7febf
RK
113
114@noindent
115is a valid (though slightly more complex than necessary) expression
116for the absolute value of @code{foo ()}.
117
118The last thing in the compound statement should be an expression
119followed by a semicolon; the value of this subexpression serves as the
120value of the entire construct. (If you use some other kind of statement
121last within the braces, the construct has type @code{void}, and thus
122effectively no value.)
123
124This feature is especially useful in making macro definitions ``safe'' (so
125that they evaluate each operand exactly once). For example, the
126``maximum'' function is commonly defined as a macro in standard C as
127follows:
128
3ab51846 129@smallexample
c1f7febf 130#define max(a,b) ((a) > (b) ? (a) : (b))
3ab51846 131@end smallexample
c1f7febf
RK
132
133@noindent
134@cindex side effects, macro argument
135But this definition computes either @var{a} or @var{b} twice, with bad
136results if the operand has side effects. In GNU C, if you know the
962e6e00 137type of the operands (here taken as @code{int}), you can define
c1f7febf
RK
138the macro safely as follows:
139
3ab51846 140@smallexample
c1f7febf
RK
141#define maxint(a,b) \
142 (@{int _a = (a), _b = (b); _a > _b ? _a : _b; @})
3ab51846 143@end smallexample
c1f7febf
RK
144
145Embedded statements are not allowed in constant expressions, such as
c771326b 146the value of an enumeration constant, the width of a bit-field, or
c1f7febf
RK
147the initial value of a static variable.
148
149If you don't know the type of the operand, you can still do this, but you
95f79357 150must use @code{typeof} (@pxref{Typeof}).
c1f7febf 151
a5bcc582
NS
152In G++, the result value of a statement expression undergoes array and
153function pointer decay, and is returned by value to the enclosing
8a36672b 154expression. For instance, if @code{A} is a class, then
b98e139b 155
a5bcc582
NS
156@smallexample
157 A a;
b98e139b 158
a5bcc582
NS
159 (@{a;@}).Foo ()
160@end smallexample
b98e139b
MM
161
162@noindent
a5bcc582
NS
163will construct a temporary @code{A} object to hold the result of the
164statement expression, and that will be used to invoke @code{Foo}.
165Therefore the @code{this} pointer observed by @code{Foo} will not be the
166address of @code{a}.
167
168Any temporaries created within a statement within a statement expression
169will be destroyed at the statement's end. This makes statement
170expressions inside macros slightly different from function calls. In
171the latter case temporaries introduced during argument evaluation will
172be destroyed at the end of the statement that includes the function
173call. In the statement expression case they will be destroyed during
174the statement expression. For instance,
b98e139b 175
a5bcc582
NS
176@smallexample
177#define macro(a) (@{__typeof__(a) b = (a); b + 3; @})
178template<typename T> T function(T a) @{ T b = a; return b + 3; @}
179
180void foo ()
181@{
182 macro (X ());
183 function (X ());
184@}
185@end smallexample
b98e139b
MM
186
187@noindent
a5bcc582
NS
188will have different places where temporaries are destroyed. For the
189@code{macro} case, the temporary @code{X} will be destroyed just after
190the initialization of @code{b}. In the @code{function} case that
191temporary will be destroyed when the function returns.
b98e139b
MM
192
193These considerations mean that it is probably a bad idea to use
194statement-expressions of this form in header files that are designed to
54e1d3a6
MM
195work with C++. (Note that some versions of the GNU C Library contained
196header files using statement-expression that lead to precisely this
197bug.)
b98e139b 198
16ef3acc
JM
199Jumping into a statement expression with @code{goto} or using a
200@code{switch} statement outside the statement expression with a
201@code{case} or @code{default} label inside the statement expression is
202not permitted. Jumping into a statement expression with a computed
203@code{goto} (@pxref{Labels as Values}) yields undefined behavior.
204Jumping out of a statement expression is permitted, but if the
205statement expression is part of a larger expression then it is
206unspecified which other subexpressions of that expression have been
207evaluated except where the language definition requires certain
208subexpressions to be evaluated before or after the statement
209expression. In any case, as with a function call the evaluation of a
210statement expression is not interleaved with the evaluation of other
211parts of the containing expression. For example,
212
213@smallexample
214 foo (), ((@{ bar1 (); goto a; 0; @}) + bar2 ()), baz();
215@end smallexample
216
217@noindent
218will call @code{foo} and @code{bar1} and will not call @code{baz} but
219may or may not call @code{bar2}. If @code{bar2} is called, it will be
220called after @code{foo} and before @code{bar1}
221
c1f7febf
RK
222@node Local Labels
223@section Locally Declared Labels
224@cindex local labels
225@cindex macros, local labels
226
14e33ee8 227GCC allows you to declare @dfn{local labels} in any nested block
8a36672b 228scope. A local label is just like an ordinary label, but you can
14e33ee8 229only reference it (with a @code{goto} statement, or by taking its
daf2f129 230address) within the block in which it was declared.
c1f7febf
RK
231
232A local label declaration looks like this:
233
3ab51846 234@smallexample
c1f7febf 235__label__ @var{label};
3ab51846 236@end smallexample
c1f7febf
RK
237
238@noindent
239or
240
3ab51846 241@smallexample
0d893a63 242__label__ @var{label1}, @var{label2}, /* @r{@dots{}} */;
3ab51846 243@end smallexample
c1f7febf 244
14e33ee8
ZW
245Local label declarations must come at the beginning of the block,
246before any ordinary declarations or statements.
c1f7febf
RK
247
248The label declaration defines the label @emph{name}, but does not define
249the label itself. You must do this in the usual way, with
250@code{@var{label}:}, within the statements of the statement expression.
251
14e33ee8
ZW
252The local label feature is useful for complex macros. If a macro
253contains nested loops, a @code{goto} can be useful for breaking out of
254them. However, an ordinary label whose scope is the whole function
255cannot be used: if the macro can be expanded several times in one
256function, the label will be multiply defined in that function. A
257local label avoids this problem. For example:
258
3ab51846 259@smallexample
14e33ee8
ZW
260#define SEARCH(value, array, target) \
261do @{ \
262 __label__ found; \
263 typeof (target) _SEARCH_target = (target); \
264 typeof (*(array)) *_SEARCH_array = (array); \
265 int i, j; \
266 int value; \
267 for (i = 0; i < max; i++) \
268 for (j = 0; j < max; j++) \
269 if (_SEARCH_array[i][j] == _SEARCH_target) \
270 @{ (value) = i; goto found; @} \
271 (value) = -1; \
272 found:; \
273@} while (0)
3ab51846 274@end smallexample
14e33ee8
ZW
275
276This could also be written using a statement-expression:
c1f7febf 277
3ab51846 278@smallexample
c1f7febf 279#define SEARCH(array, target) \
310668e8 280(@{ \
c1f7febf
RK
281 __label__ found; \
282 typeof (target) _SEARCH_target = (target); \
283 typeof (*(array)) *_SEARCH_array = (array); \
284 int i, j; \
285 int value; \
286 for (i = 0; i < max; i++) \
287 for (j = 0; j < max; j++) \
288 if (_SEARCH_array[i][j] == _SEARCH_target) \
310668e8 289 @{ value = i; goto found; @} \
c1f7febf
RK
290 value = -1; \
291 found: \
292 value; \
293@})
3ab51846 294@end smallexample
c1f7febf 295
14e33ee8
ZW
296Local label declarations also make the labels they declare visible to
297nested functions, if there are any. @xref{Nested Functions}, for details.
298
c1f7febf
RK
299@node Labels as Values
300@section Labels as Values
301@cindex labels as values
302@cindex computed gotos
303@cindex goto with computed label
304@cindex address of a label
305
306You can get the address of a label defined in the current function
307(or a containing function) with the unary operator @samp{&&}. The
308value has type @code{void *}. This value is a constant and can be used
309wherever a constant of that type is valid. For example:
310
3ab51846 311@smallexample
c1f7febf 312void *ptr;
0d893a63 313/* @r{@dots{}} */
c1f7febf 314ptr = &&foo;
3ab51846 315@end smallexample
c1f7febf
RK
316
317To use these values, you need to be able to jump to one. This is done
318with the computed goto statement@footnote{The analogous feature in
319Fortran is called an assigned goto, but that name seems inappropriate in
320C, where one can do more than simply store label addresses in label
321variables.}, @code{goto *@var{exp};}. For example,
322
3ab51846 323@smallexample
c1f7febf 324goto *ptr;
3ab51846 325@end smallexample
c1f7febf
RK
326
327@noindent
328Any expression of type @code{void *} is allowed.
329
330One way of using these constants is in initializing a static array that
331will serve as a jump table:
332
3ab51846 333@smallexample
c1f7febf 334static void *array[] = @{ &&foo, &&bar, &&hack @};
3ab51846 335@end smallexample
c1f7febf
RK
336
337Then you can select a label with indexing, like this:
338
3ab51846 339@smallexample
c1f7febf 340goto *array[i];
3ab51846 341@end smallexample
c1f7febf
RK
342
343@noindent
344Note that this does not check whether the subscript is in bounds---array
345indexing in C never does that.
346
347Such an array of label values serves a purpose much like that of the
348@code{switch} statement. The @code{switch} statement is cleaner, so
349use that rather than an array unless the problem does not fit a
350@code{switch} statement very well.
351
352Another use of label values is in an interpreter for threaded code.
353The labels within the interpreter function can be stored in the
354threaded code for super-fast dispatching.
355
02f52e19 356You may not use this mechanism to jump to code in a different function.
47620e09 357If you do that, totally unpredictable things will happen. The best way to
c1f7febf
RK
358avoid this is to store the label address only in automatic variables and
359never pass it as an argument.
360
47620e09
RH
361An alternate way to write the above example is
362
3ab51846 363@smallexample
310668e8
JM
364static const int array[] = @{ &&foo - &&foo, &&bar - &&foo,
365 &&hack - &&foo @};
47620e09 366goto *(&&foo + array[i]);
3ab51846 367@end smallexample
47620e09
RH
368
369@noindent
370This is more friendly to code living in shared libraries, as it reduces
371the number of dynamic relocations that are needed, and by consequence,
372allows the data to be read-only.
373
2092ee7d
JJ
374The @code{&&foo} expressions for the same label might have different values
375if the containing function is inlined or cloned. If a program relies on
376them being always the same, @code{__attribute__((__noinline__))} should
377be used to prevent inlining. If @code{&&foo} is used
378in a static variable initializer, inlining is forbidden.
379
c1f7febf
RK
380@node Nested Functions
381@section Nested Functions
382@cindex nested functions
383@cindex downward funargs
384@cindex thunks
385
386A @dfn{nested function} is a function defined inside another function.
387(Nested functions are not supported for GNU C++.) The nested function's
388name is local to the block where it is defined. For example, here we
389define a nested function named @code{square}, and call it twice:
390
3ab51846 391@smallexample
c1f7febf
RK
392@group
393foo (double a, double b)
394@{
395 double square (double z) @{ return z * z; @}
396
397 return square (a) + square (b);
398@}
399@end group
3ab51846 400@end smallexample
c1f7febf
RK
401
402The nested function can access all the variables of the containing
403function that are visible at the point of its definition. This is
404called @dfn{lexical scoping}. For example, here we show a nested
405function which uses an inherited variable named @code{offset}:
406
3ab51846 407@smallexample
aee96fe9 408@group
c1f7febf
RK
409bar (int *array, int offset, int size)
410@{
411 int access (int *array, int index)
412 @{ return array[index + offset]; @}
413 int i;
0d893a63 414 /* @r{@dots{}} */
c1f7febf 415 for (i = 0; i < size; i++)
0d893a63 416 /* @r{@dots{}} */ access (array, i) /* @r{@dots{}} */
c1f7febf 417@}
aee96fe9 418@end group
3ab51846 419@end smallexample
c1f7febf
RK
420
421Nested function definitions are permitted within functions in the places
475b6e22
JM
422where variable definitions are allowed; that is, in any block, mixed
423with the other declarations and statements in the block.
c1f7febf
RK
424
425It is possible to call the nested function from outside the scope of its
426name by storing its address or passing the address to another function:
427
3ab51846 428@smallexample
c1f7febf
RK
429hack (int *array, int size)
430@{
431 void store (int index, int value)
432 @{ array[index] = value; @}
433
434 intermediate (store, size);
435@}
3ab51846 436@end smallexample
c1f7febf
RK
437
438Here, the function @code{intermediate} receives the address of
439@code{store} as an argument. If @code{intermediate} calls @code{store},
440the arguments given to @code{store} are used to store into @code{array}.
441But this technique works only so long as the containing function
442(@code{hack}, in this example) does not exit.
443
444If you try to call the nested function through its address after the
445containing function has exited, all hell will break loose. If you try
446to call it after a containing scope level has exited, and if it refers
447to some of the variables that are no longer in scope, you may be lucky,
448but it's not wise to take the risk. If, however, the nested function
449does not refer to anything that has gone out of scope, you should be
450safe.
451
9c34dbbf
ZW
452GCC implements taking the address of a nested function using a technique
453called @dfn{trampolines}. A paper describing them is available as
454
455@noindent
b73b1546 456@uref{http://people.debian.org/~aaronl/Usenix88-lexic.pdf}.
c1f7febf
RK
457
458A nested function can jump to a label inherited from a containing
459function, provided the label was explicitly declared in the containing
460function (@pxref{Local Labels}). Such a jump returns instantly to the
461containing function, exiting the nested function which did the
462@code{goto} and any intermediate functions as well. Here is an example:
463
3ab51846 464@smallexample
c1f7febf
RK
465@group
466bar (int *array, int offset, int size)
467@{
468 __label__ failure;
469 int access (int *array, int index)
470 @{
471 if (index > size)
472 goto failure;
473 return array[index + offset];
474 @}
475 int i;
0d893a63 476 /* @r{@dots{}} */
c1f7febf 477 for (i = 0; i < size; i++)
0d893a63
MK
478 /* @r{@dots{}} */ access (array, i) /* @r{@dots{}} */
479 /* @r{@dots{}} */
c1f7febf
RK
480 return 0;
481
482 /* @r{Control comes here from @code{access}
483 if it detects an error.} */
484 failure:
485 return -1;
486@}
487@end group
3ab51846 488@end smallexample
c1f7febf 489
28697267
DJ
490A nested function always has no linkage. Declaring one with
491@code{extern} or @code{static} is erroneous. If you need to declare the nested function
c1f7febf
RK
492before its definition, use @code{auto} (which is otherwise meaningless
493for function declarations).
494
3ab51846 495@smallexample
c1f7febf
RK
496bar (int *array, int offset, int size)
497@{
498 __label__ failure;
499 auto int access (int *, int);
0d893a63 500 /* @r{@dots{}} */
c1f7febf
RK
501 int access (int *array, int index)
502 @{
503 if (index > size)
504 goto failure;
505 return array[index + offset];
506 @}
0d893a63 507 /* @r{@dots{}} */
c1f7febf 508@}
3ab51846 509@end smallexample
c1f7febf
RK
510
511@node Constructing Calls
512@section Constructing Function Calls
513@cindex constructing calls
514@cindex forwarding calls
515
516Using the built-in functions described below, you can record
517the arguments a function received, and call another function
518with the same arguments, without knowing the number or types
519of the arguments.
520
521You can also record the return value of that function call,
522and later return that value, without knowing what data type
523the function tried to return (as long as your caller expects
524that data type).
525
6429bc7c
EB
526However, these built-in functions may interact badly with some
527sophisticated features or other extensions of the language. It
528is, therefore, not recommended to use them outside very simple
529functions acting as mere forwarders for their arguments.
530
84330467
JM
531@deftypefn {Built-in Function} {void *} __builtin_apply_args ()
532This built-in function returns a pointer to data
c1f7febf
RK
533describing how to perform a call with the same arguments as were passed
534to the current function.
535
536The function saves the arg pointer register, structure value address,
537and all registers that might be used to pass arguments to a function
538into a block of memory allocated on the stack. Then it returns the
539address of that block.
84330467 540@end deftypefn
c1f7febf 541
84330467
JM
542@deftypefn {Built-in Function} {void *} __builtin_apply (void (*@var{function})(), void *@var{arguments}, size_t @var{size})
543This built-in function invokes @var{function}
544with a copy of the parameters described by @var{arguments}
545and @var{size}.
c1f7febf
RK
546
547The value of @var{arguments} should be the value returned by
548@code{__builtin_apply_args}. The argument @var{size} specifies the size
549of the stack argument data, in bytes.
550
84330467 551This function returns a pointer to data describing
c1f7febf
RK
552how to return whatever value was returned by @var{function}. The data
553is saved in a block of memory allocated on the stack.
554
555It is not always simple to compute the proper value for @var{size}. The
556value is used by @code{__builtin_apply} to compute the amount of data
557that should be pushed on the stack and copied from the incoming argument
558area.
84330467 559@end deftypefn
c1f7febf 560
84330467 561@deftypefn {Built-in Function} {void} __builtin_return (void *@var{result})
c1f7febf
RK
562This built-in function returns the value described by @var{result} from
563the containing function. You should specify, for @var{result}, a value
564returned by @code{__builtin_apply}.
84330467 565@end deftypefn
c1f7febf 566
6ef5231b
JJ
567@deftypefn {Built-in Function} __builtin_va_arg_pack ()
568This built-in function represents all anonymous arguments of an inline
569function. It can be used only in inline functions which will be always
570inlined, never compiled as a separate function, such as those using
571@code{__attribute__ ((__always_inline__))} or
572@code{__attribute__ ((__gnu_inline__))} extern inline functions.
573It must be only passed as last argument to some other function
574with variable arguments. This is useful for writing small wrapper
575inlines for variable argument functions, when using preprocessor
576macros is undesirable. For example:
577@smallexample
578extern int myprintf (FILE *f, const char *format, ...);
579extern inline __attribute__ ((__gnu_inline__)) int
580myprintf (FILE *f, const char *format, ...)
581@{
582 int r = fprintf (f, "myprintf: ");
583 if (r < 0)
584 return r;
585 int s = fprintf (f, format, __builtin_va_arg_pack ());
586 if (s < 0)
587 return s;
588 return r + s;
589@}
590@end smallexample
591@end deftypefn
592
ab0e176c
JJ
593@deftypefn {Built-in Function} __builtin_va_arg_pack_len ()
594This built-in function returns the number of anonymous arguments of
595an inline function. It can be used only in inline functions which
596will be always inlined, never compiled as a separate function, such
597as those using @code{__attribute__ ((__always_inline__))} or
598@code{__attribute__ ((__gnu_inline__))} extern inline functions.
599For example following will do link or runtime checking of open
600arguments for optimized code:
601@smallexample
602#ifdef __OPTIMIZE__
603extern inline __attribute__((__gnu_inline__)) int
604myopen (const char *path, int oflag, ...)
605@{
606 if (__builtin_va_arg_pack_len () > 1)
607 warn_open_too_many_arguments ();
608
609 if (__builtin_constant_p (oflag))
610 @{
611 if ((oflag & O_CREAT) != 0 && __builtin_va_arg_pack_len () < 1)
612 @{
613 warn_open_missing_mode ();
614 return __open_2 (path, oflag);
615 @}
616 return open (path, oflag, __builtin_va_arg_pack ());
617 @}
618
619 if (__builtin_va_arg_pack_len () < 1)
620 return __open_2 (path, oflag);
621
622 return open (path, oflag, __builtin_va_arg_pack ());
623@}
624#endif
625@end smallexample
626@end deftypefn
627
c1f7febf
RK
628@node Typeof
629@section Referring to a Type with @code{typeof}
630@findex typeof
631@findex sizeof
632@cindex macros, types of arguments
633
634Another way to refer to the type of an expression is with @code{typeof}.
635The syntax of using of this keyword looks like @code{sizeof}, but the
636construct acts semantically like a type name defined with @code{typedef}.
637
638There are two ways of writing the argument to @code{typeof}: with an
639expression or with a type. Here is an example with an expression:
640
3ab51846 641@smallexample
c1f7febf 642typeof (x[0](1))
3ab51846 643@end smallexample
c1f7febf
RK
644
645@noindent
89aed483
JM
646This assumes that @code{x} is an array of pointers to functions;
647the type described is that of the values of the functions.
c1f7febf
RK
648
649Here is an example with a typename as the argument:
650
3ab51846 651@smallexample
c1f7febf 652typeof (int *)
3ab51846 653@end smallexample
c1f7febf
RK
654
655@noindent
656Here the type described is that of pointers to @code{int}.
657
5490d604 658If you are writing a header file that must work when included in ISO C
c1f7febf
RK
659programs, write @code{__typeof__} instead of @code{typeof}.
660@xref{Alternate Keywords}.
661
662A @code{typeof}-construct can be used anywhere a typedef name could be
663used. For example, you can use it in a declaration, in a cast, or inside
664of @code{sizeof} or @code{typeof}.
665
928c19bb
JM
666The operand of @code{typeof} is evaluated for its side effects if and
667only if it is an expression of variably modified type or the name of
668such a type.
669
95f79357
ZW
670@code{typeof} is often useful in conjunction with the
671statements-within-expressions feature. Here is how the two together can
672be used to define a safe ``maximum'' macro that operates on any
673arithmetic type and evaluates each of its arguments exactly once:
674
3ab51846 675@smallexample
95f79357
ZW
676#define max(a,b) \
677 (@{ typeof (a) _a = (a); \
678 typeof (b) _b = (b); \
679 _a > _b ? _a : _b; @})
3ab51846 680@end smallexample
95f79357 681
526278c9
VR
682@cindex underscores in variables in macros
683@cindex @samp{_} in variables in macros
684@cindex local variables in macros
685@cindex variables, local, in macros
686@cindex macros, local variables in
687
688The reason for using names that start with underscores for the local
689variables is to avoid conflicts with variable names that occur within the
690expressions that are substituted for @code{a} and @code{b}. Eventually we
691hope to design a new form of declaration syntax that allows you to declare
692variables whose scopes start only after their initializers; this will be a
693more reliable way to prevent such conflicts.
694
95f79357
ZW
695@noindent
696Some more examples of the use of @code{typeof}:
697
c1f7febf
RK
698@itemize @bullet
699@item
700This declares @code{y} with the type of what @code{x} points to.
701
3ab51846 702@smallexample
c1f7febf 703typeof (*x) y;
3ab51846 704@end smallexample
c1f7febf
RK
705
706@item
707This declares @code{y} as an array of such values.
708
3ab51846 709@smallexample
c1f7febf 710typeof (*x) y[4];
3ab51846 711@end smallexample
c1f7febf
RK
712
713@item
714This declares @code{y} as an array of pointers to characters:
715
3ab51846 716@smallexample
c1f7febf 717typeof (typeof (char *)[4]) y;
3ab51846 718@end smallexample
c1f7febf
RK
719
720@noindent
721It is equivalent to the following traditional C declaration:
722
3ab51846 723@smallexample
c1f7febf 724char *y[4];
3ab51846 725@end smallexample
c1f7febf
RK
726
727To see the meaning of the declaration using @code{typeof}, and why it
962e6e00 728might be a useful way to write, rewrite it with these macros:
c1f7febf 729
3ab51846 730@smallexample
c1f7febf
RK
731#define pointer(T) typeof(T *)
732#define array(T, N) typeof(T [N])
3ab51846 733@end smallexample
c1f7febf
RK
734
735@noindent
736Now the declaration can be rewritten this way:
737
3ab51846 738@smallexample
c1f7febf 739array (pointer (char), 4) y;
3ab51846 740@end smallexample
c1f7febf
RK
741
742@noindent
743Thus, @code{array (pointer (char), 4)} is the type of arrays of 4
744pointers to @code{char}.
745@end itemize
746
95f79357
ZW
747@emph{Compatibility Note:} In addition to @code{typeof}, GCC 2 supported
748a more limited extension which permitted one to write
749
3ab51846 750@smallexample
95f79357 751typedef @var{T} = @var{expr};
3ab51846 752@end smallexample
95f79357
ZW
753
754@noindent
755with the effect of declaring @var{T} to have the type of the expression
756@var{expr}. This extension does not work with GCC 3 (versions between
7573.0 and 3.2 will crash; 3.2.1 and later give an error). Code which
758relies on it should be rewritten to use @code{typeof}:
759
3ab51846 760@smallexample
95f79357 761typedef typeof(@var{expr}) @var{T};
3ab51846 762@end smallexample
95f79357
ZW
763
764@noindent
765This will work with all versions of GCC@.
766
c1f7febf
RK
767@node Conditionals
768@section Conditionals with Omitted Operands
769@cindex conditional expressions, extensions
770@cindex omitted middle-operands
771@cindex middle-operands, omitted
772@cindex extensions, @code{?:}
773@cindex @code{?:} extensions
774
775The middle operand in a conditional expression may be omitted. Then
776if the first operand is nonzero, its value is the value of the conditional
777expression.
778
779Therefore, the expression
780
3ab51846 781@smallexample
c1f7febf 782x ? : y
3ab51846 783@end smallexample
c1f7febf
RK
784
785@noindent
786has the value of @code{x} if that is nonzero; otherwise, the value of
787@code{y}.
788
789This example is perfectly equivalent to
790
3ab51846 791@smallexample
c1f7febf 792x ? x : y
3ab51846 793@end smallexample
c1f7febf
RK
794
795@cindex side effect in ?:
796@cindex ?: side effect
797@noindent
798In this simple case, the ability to omit the middle operand is not
799especially useful. When it becomes useful is when the first operand does,
800or may (if it is a macro argument), contain a side effect. Then repeating
801the operand in the middle would perform the side effect twice. Omitting
802the middle operand uses the value already computed without the undesirable
803effects of recomputing it.
804
805@node Long Long
806@section Double-Word Integers
807@cindex @code{long long} data types
808@cindex double-word arithmetic
809@cindex multiprecision arithmetic
4b404517
JM
810@cindex @code{LL} integer suffix
811@cindex @code{ULL} integer suffix
c1f7febf 812
4b404517
JM
813ISO C99 supports data types for integers that are at least 64 bits wide,
814and as an extension GCC supports them in C89 mode and in C++.
815Simply write @code{long long int} for a signed integer, or
c1f7febf 816@code{unsigned long long int} for an unsigned integer. To make an
84330467 817integer constant of type @code{long long int}, add the suffix @samp{LL}
c1f7febf 818to the integer. To make an integer constant of type @code{unsigned long
84330467 819long int}, add the suffix @samp{ULL} to the integer.
c1f7febf
RK
820
821You can use these types in arithmetic like any other integer types.
822Addition, subtraction, and bitwise boolean operations on these types
823are open-coded on all types of machines. Multiplication is open-coded
824if the machine supports fullword-to-doubleword a widening multiply
825instruction. Division and shifts are open-coded only on machines that
826provide special support. The operations that are not open-coded use
161d7b59 827special library routines that come with GCC@.
c1f7febf
RK
828
829There may be pitfalls when you use @code{long long} types for function
830arguments, unless you declare function prototypes. If a function
831expects type @code{int} for its argument, and you pass a value of type
832@code{long long int}, confusion will result because the caller and the
833subroutine will disagree about the number of bytes for the argument.
834Likewise, if the function expects @code{long long int} and you pass
835@code{int}. The best way to avoid such problems is to use prototypes.
836
837@node Complex
838@section Complex Numbers
839@cindex complex numbers
4b404517
JM
840@cindex @code{_Complex} keyword
841@cindex @code{__complex__} keyword
c1f7febf 842
4b404517
JM
843ISO C99 supports complex floating data types, and as an extension GCC
844supports them in C89 mode and in C++, and supports complex integer data
845types which are not part of ISO C99. You can declare complex types
846using the keyword @code{_Complex}. As an extension, the older GNU
847keyword @code{__complex__} is also supported.
c1f7febf 848
4b404517 849For example, @samp{_Complex double x;} declares @code{x} as a
c1f7febf 850variable whose real part and imaginary part are both of type
4b404517 851@code{double}. @samp{_Complex short int y;} declares @code{y} to
c1f7febf
RK
852have real and imaginary parts of type @code{short int}; this is not
853likely to be useful, but it shows that the set of complex types is
854complete.
855
856To write a constant with a complex data type, use the suffix @samp{i} or
857@samp{j} (either one; they are equivalent). For example, @code{2.5fi}
4b404517
JM
858has type @code{_Complex float} and @code{3i} has type
859@code{_Complex int}. Such a constant always has a pure imaginary
c1f7febf 860value, but you can form any complex value you like by adding one to a
4b404517
JM
861real constant. This is a GNU extension; if you have an ISO C99
862conforming C library (such as GNU libc), and want to construct complex
863constants of floating type, you should include @code{<complex.h>} and
864use the macros @code{I} or @code{_Complex_I} instead.
c1f7febf 865
4b404517
JM
866@cindex @code{__real__} keyword
867@cindex @code{__imag__} keyword
c1f7febf
RK
868To extract the real part of a complex-valued expression @var{exp}, write
869@code{__real__ @var{exp}}. Likewise, use @code{__imag__} to
4b404517
JM
870extract the imaginary part. This is a GNU extension; for values of
871floating type, you should use the ISO C99 functions @code{crealf},
872@code{creal}, @code{creall}, @code{cimagf}, @code{cimag} and
873@code{cimagl}, declared in @code{<complex.h>} and also provided as
161d7b59 874built-in functions by GCC@.
c1f7febf 875
4b404517 876@cindex complex conjugation
c1f7febf 877The operator @samp{~} performs complex conjugation when used on a value
4b404517
JM
878with a complex type. This is a GNU extension; for values of
879floating type, you should use the ISO C99 functions @code{conjf},
880@code{conj} and @code{conjl}, declared in @code{<complex.h>} and also
161d7b59 881provided as built-in functions by GCC@.
c1f7febf 882
f0523f02 883GCC can allocate complex automatic variables in a noncontiguous
c1f7febf 884fashion; it's even possible for the real part to be in a register while
580fb356
JW
885the imaginary part is on the stack (or vice-versa). Only the DWARF2
886debug info format can represent this, so use of DWARF2 is recommended.
887If you are using the stabs debug info format, GCC describes a noncontiguous
888complex variable as if it were two separate variables of noncomplex type.
c1f7febf
RK
889If the variable's actual name is @code{foo}, the two fictitious
890variables are named @code{foo$real} and @code{foo$imag}. You can
891examine and set these two fictitious variables with your debugger.
892
c77cd3d1
UB
893@node Floating Types
894@section Additional Floating Types
895@cindex additional floating types
896@cindex @code{__float80} data type
897@cindex @code{__float128} data type
898@cindex @code{w} floating point suffix
899@cindex @code{q} floating point suffix
900@cindex @code{W} floating point suffix
901@cindex @code{Q} floating point suffix
902
903As an extension, the GNU C compiler supports additional floating
904types, @code{__float80} and @code{__float128} to support 80bit
905(@code{XFmode}) and 128 bit (@code{TFmode}) floating types.
906Support for additional types includes the arithmetic operators:
907add, subtract, multiply, divide; unary arithmetic operators;
908relational operators; equality operators; and conversions to and from
909integer and other floating types. Use a suffix @samp{w} or @samp{W}
910in a literal constant of type @code{__float80} and @samp{q} or @samp{Q}
911for @code{_float128}. You can declare complex types using the
912corresponding internal complex type, @code{XCmode} for @code{__float80}
913type and @code{TCmode} for @code{__float128} type:
914
915@smallexample
916typedef _Complex float __attribute__((mode(TC))) _Complex128;
917typedef _Complex float __attribute__((mode(XC))) _Complex80;
918@end smallexample
919
920Not all targets support additional floating point types. @code{__float80}
921is supported on i386, x86_64 and ia64 targets and target @code{__float128}
922is supported on x86_64 and ia64 targets.
923
9a8ce21f 924@node Decimal Float
85a92f7e
JJ
925@section Decimal Floating Types
926@cindex decimal floating types
9a8ce21f
JG
927@cindex @code{_Decimal32} data type
928@cindex @code{_Decimal64} data type
929@cindex @code{_Decimal128} data type
930@cindex @code{df} integer suffix
931@cindex @code{dd} integer suffix
932@cindex @code{dl} integer suffix
933@cindex @code{DF} integer suffix
934@cindex @code{DD} integer suffix
935@cindex @code{DL} integer suffix
936
85a92f7e 937As an extension, the GNU C compiler supports decimal floating types as
853eda8d 938defined in the N1312 draft of ISO/IEC WDTR24732. Support for decimal
85a92f7e
JJ
939floating types in GCC will evolve as the draft technical report changes.
940Calling conventions for any target might also change. Not all targets
941support decimal floating types.
9a8ce21f 942
85a92f7e
JJ
943The decimal floating types are @code{_Decimal32}, @code{_Decimal64}, and
944@code{_Decimal128}. They use a radix of ten, unlike the floating types
945@code{float}, @code{double}, and @code{long double} whose radix is not
946specified by the C standard but is usually two.
947
948Support for decimal floating types includes the arithmetic operators
9a8ce21f
JG
949add, subtract, multiply, divide; unary arithmetic operators;
950relational operators; equality operators; and conversions to and from
85a92f7e 951integer and other floating types. Use a suffix @samp{df} or
9a8ce21f
JG
952@samp{DF} in a literal constant of type @code{_Decimal32}, @samp{dd}
953or @samp{DD} for @code{_Decimal64}, and @samp{dl} or @samp{DL} for
954@code{_Decimal128}.
955
85a92f7e
JJ
956GCC support of decimal float as specified by the draft technical report
957is incomplete:
958
959@itemize @bullet
85a92f7e
JJ
960@item
961When the value of a decimal floating type cannot be represented in the
962integer type to which it is being converted, the result is undefined
963rather than the result value specified by the draft technical report.
853eda8d
JJ
964
965@item
966GCC does not provide the C library functionality associated with
967@file{math.h}, @file{fenv.h}, @file{stdio.h}, @file{stdlib.h}, and
968@file{wchar.h}, which must come from a separate C library implementation.
969Because of this the GNU C compiler does not define macro
970@code{__STDC_DEC_FP__} to indicate that the implementation conforms to
971the technical report.
85a92f7e 972@end itemize
9a8ce21f
JG
973
974Types @code{_Decimal32}, @code{_Decimal64}, and @code{_Decimal128}
975are supported by the DWARF2 debug information format.
976
6f4d7222 977@node Hex Floats
6b42b9ea
UD
978@section Hex Floats
979@cindex hex floats
c5c76735 980
4b404517 981ISO C99 supports floating-point numbers written not only in the usual
6f4d7222 982decimal notation, such as @code{1.55e1}, but also numbers such as
4b404517
JM
983@code{0x1.fp3} written in hexadecimal format. As a GNU extension, GCC
984supports this in C89 mode (except in some cases when strictly
985conforming) and in C++. In that format the
84330467 986@samp{0x} hex introducer and the @samp{p} or @samp{P} exponent field are
6f4d7222 987mandatory. The exponent is a decimal number that indicates the power of
84330467 9882 by which the significant part will be multiplied. Thus @samp{0x1.f} is
aee96fe9
JM
989@tex
990$1 {15\over16}$,
991@end tex
992@ifnottex
9931 15/16,
994@end ifnottex
995@samp{p3} multiplies it by 8, and the value of @code{0x1.fp3}
6f4d7222
UD
996is the same as @code{1.55e1}.
997
998Unlike for floating-point numbers in the decimal notation the exponent
999is always required in the hexadecimal notation. Otherwise the compiler
1000would not be able to resolve the ambiguity of, e.g., @code{0x1.f}. This
84330467 1001could mean @code{1.0f} or @code{1.9375} since @samp{f} is also the
6f4d7222
UD
1002extension for floating-point constants of type @code{float}.
1003
0f996086
CF
1004@node Fixed-Point
1005@section Fixed-Point Types
1006@cindex fixed-point types
1007@cindex @code{_Fract} data type
1008@cindex @code{_Accum} data type
1009@cindex @code{_Sat} data type
1010@cindex @code{hr} fixed-suffix
1011@cindex @code{r} fixed-suffix
1012@cindex @code{lr} fixed-suffix
1013@cindex @code{llr} fixed-suffix
1014@cindex @code{uhr} fixed-suffix
1015@cindex @code{ur} fixed-suffix
1016@cindex @code{ulr} fixed-suffix
1017@cindex @code{ullr} fixed-suffix
1018@cindex @code{hk} fixed-suffix
1019@cindex @code{k} fixed-suffix
1020@cindex @code{lk} fixed-suffix
1021@cindex @code{llk} fixed-suffix
1022@cindex @code{uhk} fixed-suffix
1023@cindex @code{uk} fixed-suffix
1024@cindex @code{ulk} fixed-suffix
1025@cindex @code{ullk} fixed-suffix
1026@cindex @code{HR} fixed-suffix
1027@cindex @code{R} fixed-suffix
1028@cindex @code{LR} fixed-suffix
1029@cindex @code{LLR} fixed-suffix
1030@cindex @code{UHR} fixed-suffix
1031@cindex @code{UR} fixed-suffix
1032@cindex @code{ULR} fixed-suffix
1033@cindex @code{ULLR} fixed-suffix
1034@cindex @code{HK} fixed-suffix
1035@cindex @code{K} fixed-suffix
1036@cindex @code{LK} fixed-suffix
1037@cindex @code{LLK} fixed-suffix
1038@cindex @code{UHK} fixed-suffix
1039@cindex @code{UK} fixed-suffix
1040@cindex @code{ULK} fixed-suffix
1041@cindex @code{ULLK} fixed-suffix
1042
1043As an extension, the GNU C compiler supports fixed-point types as
1044defined in the N1169 draft of ISO/IEC DTR 18037. Support for fixed-point
1045types in GCC will evolve as the draft technical report changes.
1046Calling conventions for any target might also change. Not all targets
1047support fixed-point types.
1048
1049The fixed-point types are
1050@code{short _Fract},
1051@code{_Fract},
1052@code{long _Fract},
1053@code{long long _Fract},
1054@code{unsigned short _Fract},
1055@code{unsigned _Fract},
1056@code{unsigned long _Fract},
1057@code{unsigned long long _Fract},
1058@code{_Sat short _Fract},
1059@code{_Sat _Fract},
1060@code{_Sat long _Fract},
1061@code{_Sat long long _Fract},
1062@code{_Sat unsigned short _Fract},
1063@code{_Sat unsigned _Fract},
1064@code{_Sat unsigned long _Fract},
1065@code{_Sat unsigned long long _Fract},
1066@code{short _Accum},
1067@code{_Accum},
1068@code{long _Accum},
1069@code{long long _Accum},
1070@code{unsigned short _Accum},
1071@code{unsigned _Accum},
1072@code{unsigned long _Accum},
1073@code{unsigned long long _Accum},
1074@code{_Sat short _Accum},
1075@code{_Sat _Accum},
1076@code{_Sat long _Accum},
1077@code{_Sat long long _Accum},
1078@code{_Sat unsigned short _Accum},
1079@code{_Sat unsigned _Accum},
1080@code{_Sat unsigned long _Accum},
1081@code{_Sat unsigned long long _Accum}.
8fd94bda 1082
0f996086
CF
1083Fixed-point data values contain fractional and optional integral parts.
1084The format of fixed-point data varies and depends on the target machine.
1085
8fd94bda
JJ
1086Support for fixed-point types includes:
1087@itemize @bullet
1088@item
1089prefix and postfix increment and decrement operators (@code{++}, @code{--})
1090@item
1091unary arithmetic operators (@code{+}, @code{-}, @code{!})
1092@item
1093binary arithmetic operators (@code{+}, @code{-}, @code{*}, @code{/})
1094@item
1095binary shift operators (@code{<<}, @code{>>})
1096@item
1097relational operators (@code{<}, @code{<=}, @code{>=}, @code{>})
1098@item
1099equality operators (@code{==}, @code{!=})
1100@item
1101assignment operators (@code{+=}, @code{-=}, @code{*=}, @code{/=},
1102@code{<<=}, @code{>>=})
1103@item
1104conversions to and from integer, floating-point, or fixed-point types
1105@end itemize
1106
1107Use a suffix in a fixed-point literal constant:
1108@itemize
1109@item @samp{hr} or @samp{HR} for @code{short _Fract} and
1110@code{_Sat short _Fract}
1111@item @samp{r} or @samp{R} for @code{_Fract} and @code{_Sat _Fract}
1112@item @samp{lr} or @samp{LR} for @code{long _Fract} and
1113@code{_Sat long _Fract}
1114@item @samp{llr} or @samp{LLR} for @code{long long _Fract} and
1115@code{_Sat long long _Fract}
1116@item @samp{uhr} or @samp{UHR} for @code{unsigned short _Fract} and
1117@code{_Sat unsigned short _Fract}
1118@item @samp{ur} or @samp{UR} for @code{unsigned _Fract} and
1119@code{_Sat unsigned _Fract}
1120@item @samp{ulr} or @samp{ULR} for @code{unsigned long _Fract} and
1121@code{_Sat unsigned long _Fract}
1122@item @samp{ullr} or @samp{ULLR} for @code{unsigned long long _Fract}
1123and @code{_Sat unsigned long long _Fract}
1124@item @samp{hk} or @samp{HK} for @code{short _Accum} and
1125@code{_Sat short _Accum}
1126@item @samp{k} or @samp{K} for @code{_Accum} and @code{_Sat _Accum}
1127@item @samp{lk} or @samp{LK} for @code{long _Accum} and
1128@code{_Sat long _Accum}
1129@item @samp{llk} or @samp{LLK} for @code{long long _Accum} and
1130@code{_Sat long long _Accum}
1131@item @samp{uhk} or @samp{UHK} for @code{unsigned short _Accum} and
1132@code{_Sat unsigned short _Accum}
1133@item @samp{uk} or @samp{UK} for @code{unsigned _Accum} and
1134@code{_Sat unsigned _Accum}
1135@item @samp{ulk} or @samp{ULK} for @code{unsigned long _Accum} and
1136@code{_Sat unsigned long _Accum}
1137@item @samp{ullk} or @samp{ULLK} for @code{unsigned long long _Accum}
1138and @code{_Sat unsigned long long _Accum}
1139@end itemize
0f996086
CF
1140
1141GCC support of fixed-point types as specified by the draft technical report
1142is incomplete:
1143
1144@itemize @bullet
1145@item
1146Pragmas to control overflow and rounding behaviors are not implemented.
1147@end itemize
1148
1149Fixed-point types are supported by the DWARF2 debug information format.
1150
c1f7febf
RK
1151@node Zero Length
1152@section Arrays of Length Zero
1153@cindex arrays of length zero
1154@cindex zero-length arrays
1155@cindex length-zero arrays
ffc5c6a9 1156@cindex flexible array members
c1f7febf 1157
161d7b59 1158Zero-length arrays are allowed in GNU C@. They are very useful as the
584ef5fe 1159last element of a structure which is really a header for a variable-length
c1f7febf
RK
1160object:
1161
3ab51846 1162@smallexample
c1f7febf
RK
1163struct line @{
1164 int length;
1165 char contents[0];
1166@};
1167
584ef5fe
RH
1168struct line *thisline = (struct line *)
1169 malloc (sizeof (struct line) + this_length);
1170thisline->length = this_length;
3ab51846 1171@end smallexample
c1f7febf 1172
3764f879 1173In ISO C90, you would have to give @code{contents} a length of 1, which
c1f7febf
RK
1174means either you waste space or complicate the argument to @code{malloc}.
1175
02f52e19 1176In ISO C99, you would use a @dfn{flexible array member}, which is
584ef5fe
RH
1177slightly different in syntax and semantics:
1178
1179@itemize @bullet
1180@item
1181Flexible array members are written as @code{contents[]} without
1182the @code{0}.
1183
1184@item
1185Flexible array members have incomplete type, and so the @code{sizeof}
1186operator may not be applied. As a quirk of the original implementation
1187of zero-length arrays, @code{sizeof} evaluates to zero.
1188
1189@item
1190Flexible array members may only appear as the last member of a
e7b6a0ee 1191@code{struct} that is otherwise non-empty.
2984fe64
JM
1192
1193@item
1194A structure containing a flexible array member, or a union containing
1195such a structure (possibly recursively), may not be a member of a
1196structure or an element of an array. (However, these uses are
1197permitted by GCC as extensions.)
ffc5c6a9 1198@end itemize
a25f1211 1199
ffc5c6a9 1200GCC versions before 3.0 allowed zero-length arrays to be statically
e7b6a0ee
DD
1201initialized, as if they were flexible arrays. In addition to those
1202cases that were useful, it also allowed initializations in situations
1203that would corrupt later data. Non-empty initialization of zero-length
1204arrays is now treated like any case where there are more initializer
1205elements than the array holds, in that a suitable warning about "excess
1206elements in array" is given, and the excess elements (all of them, in
1207this case) are ignored.
ffc5c6a9
RH
1208
1209Instead GCC allows static initialization of flexible array members.
1210This is equivalent to defining a new structure containing the original
1211structure followed by an array of sufficient size to contain the data.
e979f9e8 1212I.e.@: in the following, @code{f1} is constructed as if it were declared
ffc5c6a9 1213like @code{f2}.
a25f1211 1214
3ab51846 1215@smallexample
ffc5c6a9
RH
1216struct f1 @{
1217 int x; int y[];
1218@} f1 = @{ 1, @{ 2, 3, 4 @} @};
1219
1220struct f2 @{
1221 struct f1 f1; int data[3];
1222@} f2 = @{ @{ 1 @}, @{ 2, 3, 4 @} @};
3ab51846 1223@end smallexample
584ef5fe 1224
ffc5c6a9
RH
1225@noindent
1226The convenience of this extension is that @code{f1} has the desired
1227type, eliminating the need to consistently refer to @code{f2.f1}.
1228
1229This has symmetry with normal static arrays, in that an array of
1230unknown size is also written with @code{[]}.
a25f1211 1231
ffc5c6a9
RH
1232Of course, this extension only makes sense if the extra data comes at
1233the end of a top-level object, as otherwise we would be overwriting
1234data at subsequent offsets. To avoid undue complication and confusion
1235with initialization of deeply nested arrays, we simply disallow any
1236non-empty initialization except when the structure is the top-level
1237object. For example:
584ef5fe 1238
3ab51846 1239@smallexample
ffc5c6a9
RH
1240struct foo @{ int x; int y[]; @};
1241struct bar @{ struct foo z; @};
1242
13ba36b4
JM
1243struct foo a = @{ 1, @{ 2, 3, 4 @} @}; // @r{Valid.}
1244struct bar b = @{ @{ 1, @{ 2, 3, 4 @} @} @}; // @r{Invalid.}
1245struct bar c = @{ @{ 1, @{ @} @} @}; // @r{Valid.}
1246struct foo d[1] = @{ @{ 1 @{ 2, 3, 4 @} @} @}; // @r{Invalid.}
3ab51846 1247@end smallexample
4b606faf 1248
ba05abd3
GK
1249@node Empty Structures
1250@section Structures With No Members
1251@cindex empty structures
1252@cindex zero-size structures
1253
1254GCC permits a C structure to have no members:
1255
3ab51846 1256@smallexample
ba05abd3
GK
1257struct empty @{
1258@};
3ab51846 1259@end smallexample
ba05abd3
GK
1260
1261The structure will have size zero. In C++, empty structures are part
db0b376e
MM
1262of the language. G++ treats empty structures as if they had a single
1263member of type @code{char}.
ba05abd3 1264
c1f7febf
RK
1265@node Variable Length
1266@section Arrays of Variable Length
1267@cindex variable-length arrays
1268@cindex arrays of variable length
4b404517 1269@cindex VLAs
c1f7febf 1270
4b404517
JM
1271Variable-length automatic arrays are allowed in ISO C99, and as an
1272extension GCC accepts them in C89 mode and in C++. (However, GCC's
1273implementation of variable-length arrays does not yet conform in detail
1274to the ISO C99 standard.) These arrays are
c1f7febf
RK
1275declared like any other automatic arrays, but with a length that is not
1276a constant expression. The storage is allocated at the point of
1277declaration and deallocated when the brace-level is exited. For
1278example:
1279
3ab51846 1280@smallexample
c1f7febf
RK
1281FILE *
1282concat_fopen (char *s1, char *s2, char *mode)
1283@{
1284 char str[strlen (s1) + strlen (s2) + 1];
1285 strcpy (str, s1);
1286 strcat (str, s2);
1287 return fopen (str, mode);
1288@}
3ab51846 1289@end smallexample
c1f7febf
RK
1290
1291@cindex scope of a variable length array
1292@cindex variable-length array scope
1293@cindex deallocating variable length arrays
1294Jumping or breaking out of the scope of the array name deallocates the
1295storage. Jumping into the scope is not allowed; you get an error
1296message for it.
1297
1298@cindex @code{alloca} vs variable-length arrays
1299You can use the function @code{alloca} to get an effect much like
1300variable-length arrays. The function @code{alloca} is available in
1301many other C implementations (but not in all). On the other hand,
1302variable-length arrays are more elegant.
1303
1304There are other differences between these two methods. Space allocated
1305with @code{alloca} exists until the containing @emph{function} returns.
1306The space for a variable-length array is deallocated as soon as the array
1307name's scope ends. (If you use both variable-length arrays and
1308@code{alloca} in the same function, deallocation of a variable-length array
1309will also deallocate anything more recently allocated with @code{alloca}.)
1310
1311You can also use variable-length arrays as arguments to functions:
1312
3ab51846 1313@smallexample
c1f7febf
RK
1314struct entry
1315tester (int len, char data[len][len])
1316@{
0d893a63 1317 /* @r{@dots{}} */
c1f7febf 1318@}
3ab51846 1319@end smallexample
c1f7febf
RK
1320
1321The length of an array is computed once when the storage is allocated
1322and is remembered for the scope of the array in case you access it with
1323@code{sizeof}.
1324
1325If you want to pass the array first and the length afterward, you can
1326use a forward declaration in the parameter list---another GNU extension.
1327
3ab51846 1328@smallexample
c1f7febf
RK
1329struct entry
1330tester (int len; char data[len][len], int len)
1331@{
0d893a63 1332 /* @r{@dots{}} */
c1f7febf 1333@}
3ab51846 1334@end smallexample
c1f7febf
RK
1335
1336@cindex parameter forward declaration
1337The @samp{int len} before the semicolon is a @dfn{parameter forward
1338declaration}, and it serves the purpose of making the name @code{len}
1339known when the declaration of @code{data} is parsed.
1340
1341You can write any number of such parameter forward declarations in the
1342parameter list. They can be separated by commas or semicolons, but the
1343last one must end with a semicolon, which is followed by the ``real''
1344parameter declarations. Each forward declaration must match a ``real''
4b404517
JM
1345declaration in parameter name and data type. ISO C99 does not support
1346parameter forward declarations.
c1f7febf 1347
ccd96f0a
NB
1348@node Variadic Macros
1349@section Macros with a Variable Number of Arguments.
c1f7febf
RK
1350@cindex variable number of arguments
1351@cindex macro with variable arguments
1352@cindex rest argument (in macro)
ccd96f0a 1353@cindex variadic macros
c1f7febf 1354
ccd96f0a
NB
1355In the ISO C standard of 1999, a macro can be declared to accept a
1356variable number of arguments much as a function can. The syntax for
1357defining the macro is similar to that of a function. Here is an
1358example:
c1f7febf 1359
478c9e72 1360@smallexample
ccd96f0a 1361#define debug(format, ...) fprintf (stderr, format, __VA_ARGS__)
478c9e72 1362@end smallexample
c1f7febf 1363
ccd96f0a
NB
1364Here @samp{@dots{}} is a @dfn{variable argument}. In the invocation of
1365such a macro, it represents the zero or more tokens until the closing
1366parenthesis that ends the invocation, including any commas. This set of
1367tokens replaces the identifier @code{__VA_ARGS__} in the macro body
1368wherever it appears. See the CPP manual for more information.
1369
1370GCC has long supported variadic macros, and used a different syntax that
1371allowed you to give a name to the variable arguments just like any other
1372argument. Here is an example:
c1f7febf 1373
3ab51846 1374@smallexample
ccd96f0a 1375#define debug(format, args...) fprintf (stderr, format, args)
3ab51846 1376@end smallexample
c1f7febf 1377
ccd96f0a
NB
1378This is in all ways equivalent to the ISO C example above, but arguably
1379more readable and descriptive.
c1f7febf 1380
ccd96f0a
NB
1381GNU CPP has two further variadic macro extensions, and permits them to
1382be used with either of the above forms of macro definition.
1383
1384In standard C, you are not allowed to leave the variable argument out
1385entirely; but you are allowed to pass an empty argument. For example,
1386this invocation is invalid in ISO C, because there is no comma after
1387the string:
c1f7febf 1388
3ab51846 1389@smallexample
ccd96f0a 1390debug ("A message")
3ab51846 1391@end smallexample
c1f7febf 1392
ccd96f0a
NB
1393GNU CPP permits you to completely omit the variable arguments in this
1394way. In the above examples, the compiler would complain, though since
1395the expansion of the macro still has the extra comma after the format
1396string.
1397
1398To help solve this problem, CPP behaves specially for variable arguments
1399used with the token paste operator, @samp{##}. If instead you write
c1f7febf 1400
478c9e72 1401@smallexample
ccd96f0a 1402#define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
478c9e72 1403@end smallexample
c1f7febf 1404
ccd96f0a
NB
1405and if the variable arguments are omitted or empty, the @samp{##}
1406operator causes the preprocessor to remove the comma before it. If you
1407do provide some variable arguments in your macro invocation, GNU CPP
1408does not complain about the paste operation and instead places the
1409variable arguments after the comma. Just like any other pasted macro
1410argument, these arguments are not macro expanded.
1411
1412@node Escaped Newlines
1413@section Slightly Looser Rules for Escaped Newlines
1414@cindex escaped newlines
1415@cindex newlines (escaped)
1416
f458d1d5
ZW
1417Recently, the preprocessor has relaxed its treatment of escaped
1418newlines. Previously, the newline had to immediately follow a
e6cc3a24
ZW
1419backslash. The current implementation allows whitespace in the form
1420of spaces, horizontal and vertical tabs, and form feeds between the
ccd96f0a
NB
1421backslash and the subsequent newline. The preprocessor issues a
1422warning, but treats it as a valid escaped newline and combines the two
1423lines to form a single logical line. This works within comments and
e6cc3a24
ZW
1424tokens, as well as between tokens. Comments are @emph{not} treated as
1425whitespace for the purposes of this relaxation, since they have not
1426yet been replaced with spaces.
c1f7febf
RK
1427
1428@node Subscripting
1429@section Non-Lvalue Arrays May Have Subscripts
1430@cindex subscripting
1431@cindex arrays, non-lvalue
1432
1433@cindex subscripting and function values
207bf485
JM
1434In ISO C99, arrays that are not lvalues still decay to pointers, and
1435may be subscripted, although they may not be modified or used after
1436the next sequence point and the unary @samp{&} operator may not be
1437applied to them. As an extension, GCC allows such arrays to be
1438subscripted in C89 mode, though otherwise they do not decay to
1439pointers outside C99 mode. For example,
4b404517 1440this is valid in GNU C though not valid in C89:
c1f7febf 1441
3ab51846 1442@smallexample
c1f7febf
RK
1443@group
1444struct foo @{int a[4];@};
1445
1446struct foo f();
1447
1448bar (int index)
1449@{
1450 return f().a[index];
1451@}
1452@end group
3ab51846 1453@end smallexample
c1f7febf
RK
1454
1455@node Pointer Arith
1456@section Arithmetic on @code{void}- and Function-Pointers
1457@cindex void pointers, arithmetic
1458@cindex void, size of pointer to
1459@cindex function pointers, arithmetic
1460@cindex function, size of pointer to
1461
1462In GNU C, addition and subtraction operations are supported on pointers to
1463@code{void} and on pointers to functions. This is done by treating the
1464size of a @code{void} or of a function as 1.
1465
1466A consequence of this is that @code{sizeof} is also allowed on @code{void}
1467and on function types, and returns 1.
1468
84330467
JM
1469@opindex Wpointer-arith
1470The option @option{-Wpointer-arith} requests a warning if these extensions
c1f7febf
RK
1471are used.
1472
1473@node Initializers
1474@section Non-Constant Initializers
1475@cindex initializers, non-constant
1476@cindex non-constant initializers
1477
4b404517 1478As in standard C++ and ISO C99, the elements of an aggregate initializer for an
161d7b59 1479automatic variable are not required to be constant expressions in GNU C@.
c1f7febf
RK
1480Here is an example of an initializer with run-time varying elements:
1481
3ab51846 1482@smallexample
c1f7febf
RK
1483foo (float f, float g)
1484@{
1485 float beat_freqs[2] = @{ f-g, f+g @};
0d893a63 1486 /* @r{@dots{}} */
c1f7febf 1487@}
3ab51846 1488@end smallexample
c1f7febf 1489
4b404517
JM
1490@node Compound Literals
1491@section Compound Literals
c1f7febf
RK
1492@cindex constructor expressions
1493@cindex initializations in expressions
1494@cindex structures, constructor expression
1495@cindex expressions, constructor
4b404517
JM
1496@cindex compound literals
1497@c The GNU C name for what C99 calls compound literals was "constructor expressions".
c1f7febf 1498
4b404517 1499ISO C99 supports compound literals. A compound literal looks like
c1f7febf
RK
1500a cast containing an initializer. Its value is an object of the
1501type specified in the cast, containing the elements specified in
db3acfa5
JM
1502the initializer; it is an lvalue. As an extension, GCC supports
1503compound literals in C89 mode and in C++.
c1f7febf
RK
1504
1505Usually, the specified type is a structure. Assume that
1506@code{struct foo} and @code{structure} are declared as shown:
1507
3ab51846 1508@smallexample
c1f7febf 1509struct foo @{int a; char b[2];@} structure;
3ab51846 1510@end smallexample
c1f7febf
RK
1511
1512@noindent
4b404517 1513Here is an example of constructing a @code{struct foo} with a compound literal:
c1f7febf 1514
3ab51846 1515@smallexample
c1f7febf 1516structure = ((struct foo) @{x + y, 'a', 0@});
3ab51846 1517@end smallexample
c1f7febf
RK
1518
1519@noindent
1520This is equivalent to writing the following:
1521
3ab51846 1522@smallexample
c1f7febf
RK
1523@{
1524 struct foo temp = @{x + y, 'a', 0@};
1525 structure = temp;
1526@}
3ab51846 1527@end smallexample
c1f7febf 1528
4b404517 1529You can also construct an array. If all the elements of the compound literal
c1f7febf 1530are (made up of) simple constant expressions, suitable for use in
db3acfa5
JM
1531initializers of objects of static storage duration, then the compound
1532literal can be coerced to a pointer to its first element and used in
1533such an initializer, as shown here:
c1f7febf 1534
3ab51846 1535@smallexample
c1f7febf 1536char **foo = (char *[]) @{ "x", "y", "z" @};
3ab51846 1537@end smallexample
c1f7febf 1538
4b404517
JM
1539Compound literals for scalar types and union types are is
1540also allowed, but then the compound literal is equivalent
c1f7febf
RK
1541to a cast.
1542
59c83dbf
JJ
1543As a GNU extension, GCC allows initialization of objects with static storage
1544duration by compound literals (which is not possible in ISO C99, because
1545the initializer is not a constant).
1546It is handled as if the object was initialized only with the bracket
1eaf20ec 1547enclosed list if the types of the compound literal and the object match.
59c83dbf
JJ
1548The initializer list of the compound literal must be constant.
1549If the object being initialized has array type of unknown size, the size is
ad47f1e5 1550determined by compound literal size.
59c83dbf 1551
3ab51846 1552@smallexample
59c83dbf
JJ
1553static struct foo x = (struct foo) @{1, 'a', 'b'@};
1554static int y[] = (int []) @{1, 2, 3@};
1555static int z[] = (int [3]) @{1@};
3ab51846 1556@end smallexample
59c83dbf
JJ
1557
1558@noindent
1559The above lines are equivalent to the following:
3ab51846 1560@smallexample
59c83dbf
JJ
1561static struct foo x = @{1, 'a', 'b'@};
1562static int y[] = @{1, 2, 3@};
ad47f1e5 1563static int z[] = @{1, 0, 0@};
3ab51846 1564@end smallexample
59c83dbf 1565
4b404517
JM
1566@node Designated Inits
1567@section Designated Initializers
c1f7febf
RK
1568@cindex initializers with labeled elements
1569@cindex labeled elements in initializers
1570@cindex case labels in initializers
4b404517 1571@cindex designated initializers
c1f7febf 1572
26d4fec7 1573Standard C89 requires the elements of an initializer to appear in a fixed
c1f7febf
RK
1574order, the same as the order of the elements in the array or structure
1575being initialized.
1576
26d4fec7
JM
1577In ISO C99 you can give the elements in any order, specifying the array
1578indices or structure field names they apply to, and GNU C allows this as
1579an extension in C89 mode as well. This extension is not
c1f7febf
RK
1580implemented in GNU C++.
1581
26d4fec7 1582To specify an array index, write
c1f7febf
RK
1583@samp{[@var{index}] =} before the element value. For example,
1584
3ab51846 1585@smallexample
26d4fec7 1586int a[6] = @{ [4] = 29, [2] = 15 @};
3ab51846 1587@end smallexample
c1f7febf
RK
1588
1589@noindent
1590is equivalent to
1591
3ab51846 1592@smallexample
c1f7febf 1593int a[6] = @{ 0, 0, 15, 0, 29, 0 @};
3ab51846 1594@end smallexample
c1f7febf
RK
1595
1596@noindent
1597The index values must be constant expressions, even if the array being
1598initialized is automatic.
1599
26d4fec7
JM
1600An alternative syntax for this which has been obsolete since GCC 2.5 but
1601GCC still accepts is to write @samp{[@var{index}]} before the element
1602value, with no @samp{=}.
1603
c1f7febf 1604To initialize a range of elements to the same value, write
26d4fec7
JM
1605@samp{[@var{first} ... @var{last}] = @var{value}}. This is a GNU
1606extension. For example,
c1f7febf 1607
3ab51846 1608@smallexample
c1f7febf 1609int widths[] = @{ [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 @};
3ab51846 1610@end smallexample
c1f7febf 1611
8b6a5902
JJ
1612@noindent
1613If the value in it has side-effects, the side-effects will happen only once,
1614not for each initialized field by the range initializer.
1615
c1f7febf
RK
1616@noindent
1617Note that the length of the array is the highest value specified
1618plus one.
1619
1620In a structure initializer, specify the name of a field to initialize
26d4fec7 1621with @samp{.@var{fieldname} =} before the element value. For example,
c1f7febf
RK
1622given the following structure,
1623
3ab51846 1624@smallexample
c1f7febf 1625struct point @{ int x, y; @};
3ab51846 1626@end smallexample
c1f7febf
RK
1627
1628@noindent
1629the following initialization
1630
3ab51846 1631@smallexample
26d4fec7 1632struct point p = @{ .y = yvalue, .x = xvalue @};
3ab51846 1633@end smallexample
c1f7febf
RK
1634
1635@noindent
1636is equivalent to
1637
3ab51846 1638@smallexample
c1f7febf 1639struct point p = @{ xvalue, yvalue @};
3ab51846 1640@end smallexample
c1f7febf 1641
26d4fec7
JM
1642Another syntax which has the same meaning, obsolete since GCC 2.5, is
1643@samp{@var{fieldname}:}, as shown here:
c1f7febf 1644
3ab51846 1645@smallexample
26d4fec7 1646struct point p = @{ y: yvalue, x: xvalue @};
3ab51846 1647@end smallexample
c1f7febf 1648
4b404517
JM
1649@cindex designators
1650The @samp{[@var{index}]} or @samp{.@var{fieldname}} is known as a
1651@dfn{designator}. You can also use a designator (or the obsolete colon
1652syntax) when initializing a union, to specify which element of the union
1653should be used. For example,
c1f7febf 1654
3ab51846 1655@smallexample
c1f7febf
RK
1656union foo @{ int i; double d; @};
1657
26d4fec7 1658union foo f = @{ .d = 4 @};
3ab51846 1659@end smallexample
c1f7febf
RK
1660
1661@noindent
1662will convert 4 to a @code{double} to store it in the union using
1663the second element. By contrast, casting 4 to type @code{union foo}
1664would store it into the union as the integer @code{i}, since it is
1665an integer. (@xref{Cast to Union}.)
1666
1667You can combine this technique of naming elements with ordinary C
1668initialization of successive elements. Each initializer element that
4b404517 1669does not have a designator applies to the next consecutive element of the
c1f7febf
RK
1670array or structure. For example,
1671
3ab51846 1672@smallexample
c1f7febf 1673int a[6] = @{ [1] = v1, v2, [4] = v4 @};
3ab51846 1674@end smallexample
c1f7febf
RK
1675
1676@noindent
1677is equivalent to
1678
3ab51846 1679@smallexample
c1f7febf 1680int a[6] = @{ 0, v1, v2, 0, v4, 0 @};
3ab51846 1681@end smallexample
c1f7febf
RK
1682
1683Labeling the elements of an array initializer is especially useful
1684when the indices are characters or belong to an @code{enum} type.
1685For example:
1686
3ab51846 1687@smallexample
c1f7febf
RK
1688int whitespace[256]
1689 = @{ [' '] = 1, ['\t'] = 1, ['\h'] = 1,
1690 ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 @};
3ab51846 1691@end smallexample
c1f7febf 1692
4b404517 1693@cindex designator lists
26d4fec7 1694You can also write a series of @samp{.@var{fieldname}} and
4b404517 1695@samp{[@var{index}]} designators before an @samp{=} to specify a
26d4fec7
JM
1696nested subobject to initialize; the list is taken relative to the
1697subobject corresponding to the closest surrounding brace pair. For
1698example, with the @samp{struct point} declaration above:
1699
478c9e72 1700@smallexample
26d4fec7 1701struct point ptarray[10] = @{ [2].y = yv2, [2].x = xv2, [0].x = xv0 @};
478c9e72 1702@end smallexample
26d4fec7 1703
8b6a5902
JJ
1704@noindent
1705If the same field is initialized multiple times, it will have value from
1706the last initialization. If any such overridden initialization has
1707side-effect, it is unspecified whether the side-effect happens or not.
2dd76960 1708Currently, GCC will discard them and issue a warning.
8b6a5902 1709
c1f7febf
RK
1710@node Case Ranges
1711@section Case Ranges
1712@cindex case ranges
1713@cindex ranges in case statements
1714
1715You can specify a range of consecutive values in a single @code{case} label,
1716like this:
1717
3ab51846 1718@smallexample
c1f7febf 1719case @var{low} ... @var{high}:
3ab51846 1720@end smallexample
c1f7febf
RK
1721
1722@noindent
1723This has the same effect as the proper number of individual @code{case}
1724labels, one for each integer value from @var{low} to @var{high}, inclusive.
1725
1726This feature is especially useful for ranges of ASCII character codes:
1727
3ab51846 1728@smallexample
c1f7febf 1729case 'A' ... 'Z':
3ab51846 1730@end smallexample
c1f7febf
RK
1731
1732@strong{Be careful:} Write spaces around the @code{...}, for otherwise
1733it may be parsed wrong when you use it with integer values. For example,
1734write this:
1735
3ab51846 1736@smallexample
c1f7febf 1737case 1 ... 5:
3ab51846 1738@end smallexample
c1f7febf
RK
1739
1740@noindent
1741rather than this:
1742
3ab51846 1743@smallexample
c1f7febf 1744case 1...5:
3ab51846 1745@end smallexample
c1f7febf
RK
1746
1747@node Cast to Union
1748@section Cast to a Union Type
1749@cindex cast to a union
1750@cindex union, casting to a
1751
1752A cast to union type is similar to other casts, except that the type
1753specified is a union type. You can specify the type either with
1754@code{union @var{tag}} or with a typedef name. A cast to union is actually
1755a constructor though, not a cast, and hence does not yield an lvalue like
4b404517 1756normal casts. (@xref{Compound Literals}.)
c1f7febf
RK
1757
1758The types that may be cast to the union type are those of the members
1759of the union. Thus, given the following union and variables:
1760
3ab51846 1761@smallexample
c1f7febf
RK
1762union foo @{ int i; double d; @};
1763int x;
1764double y;
3ab51846 1765@end smallexample
c1f7febf
RK
1766
1767@noindent
aee96fe9 1768both @code{x} and @code{y} can be cast to type @code{union foo}.
c1f7febf
RK
1769
1770Using the cast as the right-hand side of an assignment to a variable of
1771union type is equivalent to storing in a member of the union:
1772
3ab51846 1773@smallexample
c1f7febf 1774union foo u;
0d893a63 1775/* @r{@dots{}} */
c1f7febf
RK
1776u = (union foo) x @equiv{} u.i = x
1777u = (union foo) y @equiv{} u.d = y
3ab51846 1778@end smallexample
c1f7febf
RK
1779
1780You can also use the union cast as a function argument:
1781
3ab51846 1782@smallexample
c1f7febf 1783void hack (union foo);
0d893a63 1784/* @r{@dots{}} */
c1f7febf 1785hack ((union foo) x);
3ab51846 1786@end smallexample
c1f7febf 1787
4b404517
JM
1788@node Mixed Declarations
1789@section Mixed Declarations and Code
1790@cindex mixed declarations and code
1791@cindex declarations, mixed with code
1792@cindex code, mixed with declarations
1793
1794ISO C99 and ISO C++ allow declarations and code to be freely mixed
1795within compound statements. As an extension, GCC also allows this in
1796C89 mode. For example, you could do:
1797
3ab51846 1798@smallexample
4b404517 1799int i;
0d893a63 1800/* @r{@dots{}} */
4b404517
JM
1801i++;
1802int j = i + 2;
3ab51846 1803@end smallexample
4b404517
JM
1804
1805Each identifier is visible from where it is declared until the end of
1806the enclosing block.
1807
c1f7febf
RK
1808@node Function Attributes
1809@section Declaring Attributes of Functions
1810@cindex function attributes
1811@cindex declaring attributes of functions
1812@cindex functions that never return
6e9a3221 1813@cindex functions that return more than once
c1f7febf
RK
1814@cindex functions that have no side effects
1815@cindex functions in arbitrary sections
2a59078d 1816@cindex functions that behave like malloc
c1f7febf
RK
1817@cindex @code{volatile} applied to function
1818@cindex @code{const} applied to function
26f6672d 1819@cindex functions with @code{printf}, @code{scanf}, @code{strftime} or @code{strfmon} style arguments
b34c7881 1820@cindex functions with non-null pointer arguments
c1f7febf
RK
1821@cindex functions that are passed arguments in registers on the 386
1822@cindex functions that pop the argument stack on the 386
1823@cindex functions that do not pop the argument stack on the 386
ab442df7
MM
1824@cindex functions that have different compilation options on the 386
1825@cindex functions that have different optimization options
c1f7febf
RK
1826
1827In GNU C, you declare certain things about functions called in your program
1828which help the compiler optimize function calls and check your code more
1829carefully.
1830
1831The keyword @code{__attribute__} allows you to specify special
1832attributes when making a declaration. This keyword is followed by an
9162542e 1833attribute specification inside double parentheses. The following
eacecf96 1834attributes are currently defined for functions on all targets:
837edd5f
GK
1835@code{aligned}, @code{alloc_size}, @code{noreturn},
1836@code{returns_twice}, @code{noinline}, @code{always_inline},
1837@code{flatten}, @code{pure}, @code{const}, @code{nothrow},
1838@code{sentinel}, @code{format}, @code{format_arg},
51bc54a6
DM
1839@code{no_instrument_function}, @code{section}, @code{constructor},
1840@code{destructor}, @code{used}, @code{unused}, @code{deprecated},
1841@code{weak}, @code{malloc}, @code{alias}, @code{warn_unused_result},
d752cfdb 1842@code{nonnull}, @code{gnu_inline}, @code{externally_visible},
d2af6a68
JJ
1843@code{hot}, @code{cold}, @code{artificial}, @code{error}
1844and @code{warning}.
837edd5f
GK
1845Several other attributes are defined for functions on particular
1846target systems. Other attributes, including @code{section} are
1847supported for variables declarations (@pxref{Variable Attributes}) and
1848for types (@pxref{Type Attributes}).
c1f7febf
RK
1849
1850You may also specify attributes with @samp{__} preceding and following
1851each keyword. This allows you to use them in header files without
1852being concerned about a possible macro of the same name. For example,
1853you may use @code{__noreturn__} instead of @code{noreturn}.
1854
2c5e91d2
JM
1855@xref{Attribute Syntax}, for details of the exact syntax for using
1856attributes.
1857
c1f7febf 1858@table @code
8a36672b 1859@c Keep this table alphabetized by attribute name. Treat _ as space.
c1f7febf 1860
c8619b90
NS
1861@item alias ("@var{target}")
1862@cindex @code{alias} attribute
1863The @code{alias} attribute causes the declaration to be emitted as an
1864alias for another symbol, which must be specified. For instance,
c1f7febf
RK
1865
1866@smallexample
c8619b90
NS
1867void __f () @{ /* @r{Do something.} */; @}
1868void f () __attribute__ ((weak, alias ("__f")));
c1f7febf
RK
1869@end smallexample
1870
a9b0b825 1871defines @samp{f} to be a weak alias for @samp{__f}. In C++, the
52eb57df
RH
1872mangled name for the target must be used. It is an error if @samp{__f}
1873is not defined in the same translation unit.
c8619b90
NS
1874
1875Not all target machines support this attribute.
9162542e 1876
837edd5f
GK
1877@item aligned (@var{alignment})
1878@cindex @code{aligned} attribute
1879This attribute specifies a minimum alignment for the function,
1880measured in bytes.
1881
1882You cannot use this attribute to decrease the alignment of a function,
1883only to increase it. However, when you explicitly specify a function
1884alignment this will override the effect of the
1885@option{-falign-functions} (@pxref{Optimize Options}) option for this
1886function.
1887
1888Note that the effectiveness of @code{aligned} attributes may be
1889limited by inherent limitations in your linker. On many systems, the
1890linker is only able to arrange for functions to be aligned up to a
1891certain maximum alignment. (For some linkers, the maximum supported
1892alignment may be very very small.) See your linker documentation for
1893further information.
1894
1895The @code{aligned} attribute can also be used for variables and fields
1896(@pxref{Variable Attributes}.)
1897
51bc54a6
DM
1898@item alloc_size
1899@cindex @code{alloc_size} attribute
1900The @code{alloc_size} attribute is used to tell the compiler that the
1901function return value points to memory, where the size is given by
1902one or two of the functions parameters. GCC uses this
1903information to improve the correctness of @code{__builtin_object_size}.
1904
1905The function parameter(s) denoting the allocated size are specified by
1906one or two integer arguments supplied to the attribute. The allocated size
1907is either the value of the single function argument specified or the product
1908of the two function arguments specified. Argument numbering starts at
1909one.
1910
1911For instance,
1912
1913@smallexample
1914void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2)))
1c42f5c6 1915void my_realloc(void*, size_t) __attribute__((alloc_size(2)))
51bc54a6
DM
1916@end smallexample
1917
1918declares that my_calloc will return memory of the size given by
1919the product of parameter 1 and 2 and that my_realloc will return memory
1920of the size given by parameter 2.
1921
6aa77e6c 1922@item always_inline
c8619b90 1923@cindex @code{always_inline} function attribute
6aa77e6c
AH
1924Generally, functions are not inlined unless optimization is specified.
1925For functions declared inline, this attribute inlines the function even
1926if no optimization level was specified.
1927
4eb7fd83
JJ
1928@item gnu_inline
1929@cindex @code{gnu_inline} function attribute
da1c7394
ILT
1930This attribute should be used with a function which is also declared
1931with the @code{inline} keyword. It directs GCC to treat the function
1932as if it were defined in gnu89 mode even when compiling in C99 or
1933gnu99 mode.
1934
1935If the function is declared @code{extern}, then this definition of the
1936function is used only for inlining. In no case is the function
1937compiled as a standalone function, not even if you take its address
1938explicitly. Such an address becomes an external reference, as if you
1939had only declared the function, and had not defined it. This has
1940almost the effect of a macro. The way to use this is to put a
1941function definition in a header file with this attribute, and put
1942another copy of the function, without @code{extern}, in a library
1943file. The definition in the header file will cause most calls to the
1944function to be inlined. If any uses of the function remain, they will
1945refer to the single copy in the library. Note that the two
1946definitions of the functions need not be precisely the same, although
1947if they do not have the same effect your program may behave oddly.
1948
3a47c4e4
AO
1949In C, if the function is neither @code{extern} nor @code{static}, then
1950the function is compiled as a standalone function, as well as being
da1c7394
ILT
1951inlined where possible.
1952
1953This is how GCC traditionally handled functions declared
1954@code{inline}. Since ISO C99 specifies a different semantics for
1955@code{inline}, this function attribute is provided as a transition
1956measure and as a useful feature in its own right. This attribute is
1957available in GCC 4.1.3 and later. It is available if either of the
1958preprocessor macros @code{__GNUC_GNU_INLINE__} or
1959@code{__GNUC_STDC_INLINE__} are defined. @xref{Inline,,An Inline
1960Function is As Fast As a Macro}.
4eb7fd83 1961
3a47c4e4
AO
1962In C++, this attribute does not depend on @code{extern} in any way,
1963but it still requires the @code{inline} keyword to enable its special
1964behavior.
1965
d752cfdb 1966@item artificial
1df48f5c 1967@cindex @code{artificial} function attribute
d752cfdb
JJ
1968This attribute is useful for small inline wrappers which if possible
1969should appear during debugging as a unit, depending on the debug
1970info format it will either mean marking the function as artificial
1971or using the caller location for all instructions within the inlined
1972body.
1973
0691d1d4 1974@item flatten
1df48f5c 1975@cindex @code{flatten} function attribute
0691d1d4
RG
1976Generally, inlining into a function is limited. For a function marked with
1977this attribute, every call inside this function will be inlined, if possible.
1978Whether the function itself is considered for inlining depends on its size and
d6cc6ec9 1979the current inlining parameters.
0691d1d4 1980
d2af6a68
JJ
1981@item error ("@var{message}")
1982@cindex @code{error} function attribute
1983If this attribute is used on a function declaration and a call to such a function
1984is not eliminated through dead code elimination or other optimizations, an error
1985which will include @var{message} will be diagnosed. This is useful
1986for compile time checking, especially together with @code{__builtin_constant_p}
1987and inline functions where checking the inline function arguments is not
1988possible through @code{extern char [(condition) ? 1 : -1];} tricks.
1989While it is possible to leave the function undefined and thus invoke
1990a link failure, when using this attribute the problem will be diagnosed
1991earlier and with exact location of the call even in presence of inline
1992functions or when not emitting debugging information.
1993
1994@item warning ("@var{message}")
1995@cindex @code{warning} function attribute
1996If this attribute is used on a function declaration and a call to such a function
1997is not eliminated through dead code elimination or other optimizations, a warning
1998which will include @var{message} will be diagnosed. This is useful
1999for compile time checking, especially together with @code{__builtin_constant_p}
2000and inline functions. While it is possible to define the function with
2001a message in @code{.gnu.warning*} section, when using this attribute the problem
2002will be diagnosed earlier and with exact location of the call even in presence
2003of inline functions or when not emitting debugging information.
2004
c8619b90
NS
2005@item cdecl
2006@cindex functions that do pop the argument stack on the 386
2007@opindex mrtd
2008On the Intel 386, the @code{cdecl} attribute causes the compiler to
2009assume that the calling function will pop off the stack space used to
2010pass arguments. This is
2011useful to override the effects of the @option{-mrtd} switch.
2a8f6b90 2012
2a8f6b90 2013@item const
c8619b90 2014@cindex @code{const} function attribute
2a8f6b90
JH
2015Many functions do not examine any values except their arguments, and
2016have no effects except the return value. Basically this is just slightly
50c177f7 2017more strict class than the @code{pure} attribute below, since function is not
2a59078d 2018allowed to read global memory.
2a8f6b90
JH
2019
2020@cindex pointer arguments
2021Note that a function that has pointer arguments and examines the data
2022pointed to must @emph{not} be declared @code{const}. Likewise, a
2023function that calls a non-@code{const} function usually must not be
2024@code{const}. It does not make sense for a @code{const} function to
2025return @code{void}.
2026
f0523f02 2027The attribute @code{const} is not implemented in GCC versions earlier
c1f7febf
RK
2028than 2.5. An alternative way to declare that a function has no side
2029effects, which works in the current version and in some older versions,
2030is as follows:
2031
2032@smallexample
2033typedef int intfn ();
2034
2035extern const intfn square;
2036@end smallexample
2037
2038This approach does not work in GNU C++ from 2.6.0 on, since the language
2039specifies that the @samp{const} must be attached to the return value.
2040
c8619b90
NS
2041@item constructor
2042@itemx destructor
fc8600f9
MM
2043@itemx constructor (@var{priority})
2044@itemx destructor (@var{priority})
c8619b90
NS
2045@cindex @code{constructor} function attribute
2046@cindex @code{destructor} function attribute
2047The @code{constructor} attribute causes the function to be called
2048automatically before execution enters @code{main ()}. Similarly, the
2049@code{destructor} attribute causes the function to be called
2050automatically after @code{main ()} has completed or @code{exit ()} has
2051been called. Functions with these attributes are useful for
2052initializing data that will be used implicitly during the execution of
2053the program.
2054
fc8600f9
MM
2055You may provide an optional integer priority to control the order in
2056which constructor and destructor functions are run. A constructor
2057with a smaller priority number runs before a constructor with a larger
2058priority number; the opposite relationship holds for destructors. So,
2059if you have a constructor that allocates a resource and a destructor
2060that deallocates the same resource, both functions typically have the
2061same priority. The priorities for constructor and destructor
2062functions are the same as those specified for namespace-scope C++
2063objects (@pxref{C++ Attributes}).
2064
c8619b90
NS
2065These attributes are not currently implemented for Objective-C@.
2066
2067@item deprecated
9b86d6bb 2068@itemx deprecated (@var{msg})
c8619b90
NS
2069@cindex @code{deprecated} attribute.
2070The @code{deprecated} attribute results in a warning if the function
2071is used anywhere in the source file. This is useful when identifying
2072functions that are expected to be removed in a future version of a
2073program. The warning also includes the location of the declaration
2074of the deprecated function, to enable users to easily find further
2075information about why the function is deprecated, or what they should
2076do instead. Note that the warnings only occurs for uses:
2077
2078@smallexample
2079int old_fn () __attribute__ ((deprecated));
2080int old_fn ();
2081int (*fn_ptr)() = old_fn;
2082@end smallexample
2083
9b86d6bb
L
2084results in a warning on line 3 but not line 2. The optional msg
2085argument, which must be a string, will be printed in the warning if
2086present.
c8619b90
NS
2087
2088The @code{deprecated} attribute can also be used for variables and
2089types (@pxref{Variable Attributes}, @pxref{Type Attributes}.)
2090
2091@item dllexport
2092@cindex @code{__declspec(dllexport)}
b2ca3702
MM
2093On Microsoft Windows targets and Symbian OS targets the
2094@code{dllexport} attribute causes the compiler to provide a global
2095pointer to a pointer in a DLL, so that it can be referenced with the
2096@code{dllimport} attribute. On Microsoft Windows targets, the pointer
2097name is formed by combining @code{_imp__} and the function or variable
2098name.
2099
2100You can use @code{__declspec(dllexport)} as a synonym for
2101@code{__attribute__ ((dllexport))} for compatibility with other
2102compilers.
2103
2104On systems that support the @code{visibility} attribute, this
3a687f8b
MM
2105attribute also implies ``default'' visibility. It is an error to
2106explicitly specify any other visibility.
c8619b90 2107
b2ca3702
MM
2108Currently, the @code{dllexport} attribute is ignored for inlined
2109functions, unless the @option{-fkeep-inline-functions} flag has been
2110used. The attribute is also ignored for undefined symbols.
c8619b90 2111
8a36672b
JM
2112When applied to C++ classes, the attribute marks defined non-inlined
2113member functions and static data members as exports. Static consts
c8619b90
NS
2114initialized in-class are not marked unless they are also defined
2115out-of-class.
2116
b55e3aad 2117For Microsoft Windows targets there are alternative methods for
b2ca3702 2118including the symbol in the DLL's export table such as using a
b55e3aad
NC
2119@file{.def} file with an @code{EXPORTS} section or, with GNU ld, using
2120the @option{--export-all} linker flag.
c8619b90
NS
2121
2122@item dllimport
2123@cindex @code{__declspec(dllimport)}
b2ca3702 2124On Microsoft Windows and Symbian OS targets, the @code{dllimport}
b55e3aad 2125attribute causes the compiler to reference a function or variable via
b2ca3702 2126a global pointer to a pointer that is set up by the DLL exporting the
3a687f8b
MM
2127symbol. The attribute implies @code{extern}. On Microsoft Windows
2128targets, the pointer name is formed by combining @code{_imp__} and the
2129function or variable name.
b2ca3702
MM
2130
2131You can use @code{__declspec(dllimport)} as a synonym for
2132@code{__attribute__ ((dllimport))} for compatibility with other
2133compilers.
c8619b90 2134
3a687f8b
MM
2135On systems that support the @code{visibility} attribute, this
2136attribute also implies ``default'' visibility. It is an error to
2137explicitly specify any other visibility.
2138
8a36672b 2139Currently, the attribute is ignored for inlined functions. If the
c8619b90
NS
2140attribute is applied to a symbol @emph{definition}, an error is reported.
2141If a symbol previously declared @code{dllimport} is later defined, the
2142attribute is ignored in subsequent references, and a warning is emitted.
2143The attribute is also overridden by a subsequent declaration as
2144@code{dllexport}.
2145
2146When applied to C++ classes, the attribute marks non-inlined
2147member functions and static data members as imports. However, the
2148attribute is ignored for virtual methods to allow creation of vtables
2149using thunks.
2150
b2ca3702 2151On the SH Symbian OS target the @code{dllimport} attribute also has
78466c0e 2152another affect---it can cause the vtable and run-time type information
b2ca3702
MM
2153for a class to be exported. This happens when the class has a
2154dllimport'ed constructor or a non-inline, non-pure virtual function
e4ae5e77 2155and, for either of those two conditions, the class also has an inline
b2ca3702
MM
2156constructor or destructor and has a key function that is defined in
2157the current translation unit.
b55e3aad
NC
2158
2159For Microsoft Windows based targets the use of the @code{dllimport}
2160attribute on functions is not necessary, but provides a small
8a36672b 2161performance benefit by eliminating a thunk in the DLL@. The use of the
b55e3aad 2162@code{dllimport} attribute on imported variables was required on older
b2ca3702 2163versions of the GNU linker, but can now be avoided by passing the
8a36672b 2164@option{--enable-auto-import} switch to the GNU linker. As with
b2ca3702 2165functions, using the attribute for a variable eliminates a thunk in
8a36672b 2166the DLL@.
b2ca3702 2167
d32034a7
DS
2168One drawback to using this attribute is that a pointer to a
2169@emph{variable} marked as @code{dllimport} cannot be used as a constant
2170address. However, a pointer to a @emph{function} with the
2171@code{dllimport} attribute can be used as a constant initializer; in
2172this case, the address of a stub function in the import lib is
2173referenced. On Microsoft Windows targets, the attribute can be disabled
b2ca3702 2174for functions by setting the @option{-mnop-fun-dllimport} flag.
c8619b90
NS
2175
2176@item eightbit_data
2177@cindex eight bit data on the H8/300, H8/300H, and H8S
2178Use this attribute on the H8/300, H8/300H, and H8S to indicate that the specified
2179variable should be placed into the eight bit data section.
2180The compiler will generate more efficient code for certain operations
2181on data in the eight bit data area. Note the eight bit data area is limited to
2182256 bytes of data.
2183
2184You must use GAS and GLD from GNU binutils version 2.7 or later for
2185this attribute to work correctly.
2186
0d4a78eb
BS
2187@item exception_handler
2188@cindex exception handler functions on the Blackfin processor
2189Use this attribute on the Blackfin to indicate that the specified function
2190is an exception handler. The compiler will generate function entry and
2191exit sequences suitable for use in an exception handler when this
2192attribute is present.
2193
1df48f5c
JW
2194@item externally_visible
2195@cindex @code{externally_visible} attribute.
2196This attribute, attached to a global variable or function, nullifies
2197the effect of the @option{-fwhole-program} command-line option, so the
2198object remains visible outside the current compilation unit.
2199
c8619b90
NS
2200@item far
2201@cindex functions which handle memory bank switching
2202On 68HC11 and 68HC12 the @code{far} attribute causes the compiler to
2203use a calling convention that takes care of switching memory banks when
2204entering and leaving a function. This calling convention is also the
2205default when using the @option{-mlong-calls} option.
2206
2207On 68HC12 the compiler will use the @code{call} and @code{rtc} instructions
2208to call and return from a function.
2209
2210On 68HC11 the compiler will generate a sequence of instructions
2211to invoke a board-specific routine to switch the memory bank and call the
8a36672b 2212real function. The board-specific routine simulates a @code{call}.
c8619b90 2213At the end of a function, it will jump to a board-specific routine
8a36672b 2214instead of using @code{rts}. The board-specific return routine simulates
c8619b90
NS
2215the @code{rtc}.
2216
2217@item fastcall
2218@cindex functions that pop the argument stack on the 386
2219On the Intel 386, the @code{fastcall} attribute causes the compiler to
2f84b963
RG
2220pass the first argument (if of integral type) in the register ECX and
2221the second argument (if of integral type) in the register EDX@. Subsequent
2222and other typed arguments are passed on the stack. The called function will
2223pop the arguments off the stack. If the number of arguments is variable all
c8619b90 2224arguments are pushed on the stack.
c1f7febf
RK
2225
2226@item format (@var{archetype}, @var{string-index}, @var{first-to-check})
2227@cindex @code{format} function attribute
84330467 2228@opindex Wformat
bb72a084 2229The @code{format} attribute specifies that a function takes @code{printf},
26f6672d
JM
2230@code{scanf}, @code{strftime} or @code{strfmon} style arguments which
2231should be type-checked against a format string. For example, the
2232declaration:
c1f7febf
RK
2233
2234@smallexample
2235extern int
2236my_printf (void *my_object, const char *my_format, ...)
2237 __attribute__ ((format (printf, 2, 3)));
2238@end smallexample
2239
2240@noindent
2241causes the compiler to check the arguments in calls to @code{my_printf}
2242for consistency with the @code{printf} style format string argument
2243@code{my_format}.
2244
2245The parameter @var{archetype} determines how the format string is
6590fc9f
KT
2246interpreted, and should be @code{printf}, @code{scanf}, @code{strftime},
2247@code{gnu_printf}, @code{gnu_scanf}, @code{gnu_strftime} or
2248@code{strfmon}. (You can also use @code{__printf__},
2249@code{__scanf__}, @code{__strftime__} or @code{__strfmon__}.) On
2250MinGW targets, @code{ms_printf}, @code{ms_scanf}, and
2251@code{ms_strftime} are also present.
2252@var{archtype} values such as @code{printf} refer to the formats accepted
2253by the system's C run-time library, while @code{gnu_} values always refer
2254to the formats accepted by the GNU C Library. On Microsoft Windows
2255targets, @code{ms_} values refer to the formats accepted by the
2256@file{msvcrt.dll} library.
2257The parameter @var{string-index}
2258specifies which argument is the format string argument (starting
2259from 1), while @var{first-to-check} is the number of the first
2260argument to check against the format string. For functions
2261where the arguments are not available to be checked (such as
c1f7febf 2262@code{vprintf}), specify the third parameter as zero. In this case the
b722c82c
JM
2263compiler only checks the format string for consistency. For
2264@code{strftime} formats, the third parameter is required to be zero.
f57a2e3a
BE
2265Since non-static C++ methods have an implicit @code{this} argument, the
2266arguments of such methods should be counted from two, not one, when
2267giving values for @var{string-index} and @var{first-to-check}.
c1f7febf
RK
2268
2269In the example above, the format string (@code{my_format}) is the second
2270argument of the function @code{my_print}, and the arguments to check
2271start with the third argument, so the correct parameters for the format
2272attribute are 2 and 3.
2273
84330467 2274@opindex ffreestanding
e6e931b7 2275@opindex fno-builtin
c1f7febf 2276The @code{format} attribute allows you to identify your own functions
f0523f02 2277which take format strings as arguments, so that GCC can check the
b722c82c 2278calls to these functions for errors. The compiler always (unless
e6e931b7 2279@option{-ffreestanding} or @option{-fno-builtin} is used) checks formats
b722c82c 2280for the standard library functions @code{printf}, @code{fprintf},
bb72a084 2281@code{sprintf}, @code{scanf}, @code{fscanf}, @code{sscanf}, @code{strftime},
c1f7febf 2282@code{vprintf}, @code{vfprintf} and @code{vsprintf} whenever such
84330467 2283warnings are requested (using @option{-Wformat}), so there is no need to
b722c82c
JM
2284modify the header file @file{stdio.h}. In C99 mode, the functions
2285@code{snprintf}, @code{vsnprintf}, @code{vscanf}, @code{vfscanf} and
26f6672d 2286@code{vsscanf} are also checked. Except in strictly conforming C
b4c984fb
KG
2287standard modes, the X/Open function @code{strfmon} is also checked as
2288are @code{printf_unlocked} and @code{fprintf_unlocked}.
b722c82c 2289@xref{C Dialect Options,,Options Controlling C Dialect}.
c1f7febf 2290
a2bec818
DJ
2291The target may provide additional types of format checks.
2292@xref{Target Format Checks,,Format Checks Specific to Particular
2293Target Machines}.
2294
c1f7febf
RK
2295@item format_arg (@var{string-index})
2296@cindex @code{format_arg} function attribute
84330467 2297@opindex Wformat-nonliteral
26f6672d
JM
2298The @code{format_arg} attribute specifies that a function takes a format
2299string for a @code{printf}, @code{scanf}, @code{strftime} or
2300@code{strfmon} style function and modifies it (for example, to translate
2301it into another language), so the result can be passed to a
2302@code{printf}, @code{scanf}, @code{strftime} or @code{strfmon} style
2303function (with the remaining arguments to the format function the same
2304as they would have been for the unmodified string). For example, the
2305declaration:
c1f7febf
RK
2306
2307@smallexample
2308extern char *
2309my_dgettext (char *my_domain, const char *my_format)
2310 __attribute__ ((format_arg (2)));
2311@end smallexample
2312
2313@noindent
26f6672d
JM
2314causes the compiler to check the arguments in calls to a @code{printf},
2315@code{scanf}, @code{strftime} or @code{strfmon} type function, whose
2316format string argument is a call to the @code{my_dgettext} function, for
2317consistency with the format string argument @code{my_format}. If the
2318@code{format_arg} attribute had not been specified, all the compiler
2319could tell in such calls to format functions would be that the format
2320string argument is not constant; this would generate a warning when
84330467 2321@option{-Wformat-nonliteral} is used, but the calls could not be checked
26f6672d 2322without the attribute.
c1f7febf
RK
2323
2324The parameter @var{string-index} specifies which argument is the format
f57a2e3a
BE
2325string argument (starting from one). Since non-static C++ methods have
2326an implicit @code{this} argument, the arguments of such methods should
2327be counted from two.
c1f7febf
RK
2328
2329The @code{format-arg} attribute allows you to identify your own
f0523f02 2330functions which modify format strings, so that GCC can check the
26f6672d
JM
2331calls to @code{printf}, @code{scanf}, @code{strftime} or @code{strfmon}
2332type function whose operands are a call to one of your own function.
2333The compiler always treats @code{gettext}, @code{dgettext}, and
2334@code{dcgettext} in this manner except when strict ISO C support is
84330467 2335requested by @option{-ansi} or an appropriate @option{-std} option, or
e6e931b7
JM
2336@option{-ffreestanding} or @option{-fno-builtin}
2337is used. @xref{C Dialect Options,,Options
26f6672d 2338Controlling C Dialect}.
c1f7febf 2339
c8619b90 2340@item function_vector
561642fa 2341@cindex calling functions through the function vector on H8/300, M16C, M32C and SH2A processors
c8619b90
NS
2342Use this attribute on the H8/300, H8/300H, and H8S to indicate that the specified
2343function should be called through the function vector. Calling a
2344function through the function vector will reduce code size, however;
2345the function vector has a limited size (maximum 128 entries on the H8/300
2346and 64 entries on the H8/300H and H8S) and shares space with the interrupt vector.
b34c7881 2347
561642fa
AP
2348In SH2A target, this attribute declares a function to be called using the
2349TBR relative addressing mode. The argument to this attribute is the entry
2350number of the same function in a vector table containing all the TBR
2351relative addressable functions. For the successful jump, register TBR
2352should contain the start address of this TBR relative vector table.
2353In the startup routine of the user application, user needs to care of this
2354TBR register initialization. The TBR relative vector table can have at
2355max 256 function entries. The jumps to these functions will be generated
2356using a SH2A specific, non delayed branch instruction JSR/N @@(disp8,TBR).
c8619b90
NS
2357You must use GAS and GLD from GNU binutils version 2.7 or later for
2358this attribute to work correctly.
b34c7881 2359
561642fa
AP
2360Please refer the example of M16C target, to see the use of this
2361attribute while declaring a function,
2362
2363In an application, for a function being called once, this attribute will
2364save at least 8 bytes of code; and if other successive calls are being
2365made to the same function, it will save 2 bytes of code per each of these
2366calls.
2367
5abd2125
JS
2368On M16C/M32C targets, the @code{function_vector} attribute declares a
2369special page subroutine call function. Use of this attribute reduces
2370the code size by 2 bytes for each call generated to the
2371subroutine. The argument to the attribute is the vector number entry
2372from the special page vector table which contains the 16 low-order
2373bits of the subroutine's entry address. Each vector table has special
2374page number (18 to 255) which are used in @code{jsrs} instruction.
2375Jump addresses of the routines are generated by adding 0x0F0000 (in
2376case of M16C targets) or 0xFF0000 (in case of M32C targets), to the 2
2377byte addresses set in the vector table. Therefore you need to ensure
2378that all the special page vector routines should get mapped within the
2379address range 0x0F0000 to 0x0FFFFF (for M16C) and 0xFF0000 to 0xFFFFFF
2380(for M32C).
2381
2382In the following example 2 bytes will be saved for each call to
2383function @code{foo}.
2384
2385@smallexample
2386void foo (void) __attribute__((function_vector(0x18)));
2387void foo (void)
2388@{
2389@}
2390
2391void bar (void)
2392@{
2393 foo();
2394@}
2395@end smallexample
2396
2397If functions are defined in one file and are called in another file,
2398then be sure to write this declaration in both files.
2399
2400This attribute is ignored for R8C target.
2401
c8619b90
NS
2402@item interrupt
2403@cindex interrupt handler functions
e19da24c 2404Use this attribute on the ARM, AVR, CRX, M32C, M32R/D, m68k, MIPS
2bccb817
KH
2405and Xstormy16 ports to indicate that the specified function is an
2406interrupt handler. The compiler will generate function entry and exit
2407sequences suitable for use in an interrupt handler when this attribute
2408is present.
b34c7881 2409
2bccb817 2410Note, interrupt handlers for the Blackfin, H8/300, H8/300H, H8S, and
0d4a78eb 2411SH processors can be specified via the @code{interrupt_handler} attribute.
b34c7881 2412
c8619b90 2413Note, on the AVR, interrupts will be enabled inside the function.
9162542e 2414
c8619b90
NS
2415Note, for the ARM, you can specify the kind of interrupt to be handled by
2416adding an optional parameter to the interrupt attribute like this:
e23bd218
IR
2417
2418@smallexample
c8619b90 2419void f () __attribute__ ((interrupt ("IRQ")));
e23bd218
IR
2420@end smallexample
2421
c8619b90 2422Permissible values for this parameter are: IRQ, FIQ, SWI, ABORT and UNDEF@.
e23bd218 2423
7a085dce 2424On ARMv7-M the interrupt type is ignored, and the attribute means the function
5b3e6663
PB
2425may be called with a word aligned stack pointer.
2426
e19da24c
CF
2427On MIPS targets, you can use the following attributes to modify the behavior
2428of an interrupt handler:
2429@table @code
2430@item use_shadow_register_set
2431@cindex @code{use_shadow_register_set} attribute
2432Assume that the handler uses a shadow register set, instead of
2433the main general-purpose registers.
2434
2435@item keep_interrupts_masked
2436@cindex @code{keep_interrupts_masked} attribute
2437Keep interrupts masked for the whole function. Without this attribute,
2438GCC tries to reenable interrupts for as much of the function as it can.
2439
2440@item use_debug_exception_return
2441@cindex @code{use_debug_exception_return} attribute
2442Return using the @code{deret} instruction. Interrupt handlers that don't
2443have this attribute return using @code{eret} instead.
2444@end table
2445
2446You can use any combination of these attributes, as shown below:
2447@smallexample
2448void __attribute__ ((interrupt)) v0 ();
2449void __attribute__ ((interrupt, use_shadow_register_set)) v1 ();
2450void __attribute__ ((interrupt, keep_interrupts_masked)) v2 ();
2451void __attribute__ ((interrupt, use_debug_exception_return)) v3 ();
2452void __attribute__ ((interrupt, use_shadow_register_set,
2453 keep_interrupts_masked)) v4 ();
2454void __attribute__ ((interrupt, use_shadow_register_set,
2455 use_debug_exception_return)) v5 ();
2456void __attribute__ ((interrupt, keep_interrupts_masked,
2457 use_debug_exception_return)) v6 ();
2458void __attribute__ ((interrupt, use_shadow_register_set,
2459 keep_interrupts_masked,
2460 use_debug_exception_return)) v7 ();
2461@end smallexample
2462
c8619b90 2463@item interrupt_handler
0d4a78eb
BS
2464@cindex interrupt handler functions on the Blackfin, m68k, H8/300 and SH processors
2465Use this attribute on the Blackfin, m68k, H8/300, H8/300H, H8S, and SH to
2466indicate that the specified function is an interrupt handler. The compiler
2467will generate function entry and exit sequences suitable for use in an
2468interrupt handler when this attribute is present.
2469
a4242737
KH
2470@item interrupt_thread
2471@cindex interrupt thread functions on fido
2472Use this attribute on fido, a subarchitecture of the m68k, to indicate
2473that the specified function is an interrupt handler that is designed
2474to run as a thread. The compiler omits generate prologue/epilogue
2475sequences and replaces the return instruction with a @code{sleep}
2476instruction. This attribute is available only on fido.
2477
d8f8ca80
RR
2478@item isr
2479@cindex interrupt service routines on ARM
2480Use this attribute on ARM to write Interrupt Service Routines. This is an
2481alias to the @code{interrupt} attribute above.
2482
0d4a78eb
BS
2483@item kspisusp
2484@cindex User stack pointer in interrupts on the Blackfin
2485When used together with @code{interrupt_handler}, @code{exception_handler}
2486or @code{nmi_handler}, code will be generated to load the stack pointer
2487from the USP register in the function prologue.
72954a4f 2488
4af797b5
JZ
2489@item l1_text
2490@cindex @code{l1_text} function attribute
2491This attribute specifies a function to be placed into L1 Instruction
0ee2ea09 2492SRAM@. The function will be put into a specific section named @code{.l1.text}.
4af797b5
JZ
2493With @option{-mfdpic}, function calls with a such function as the callee
2494or caller will use inlined PLT.
2495
c8619b90
NS
2496@item long_call/short_call
2497@cindex indirect calls on ARM
2498This attribute specifies how a particular function is called on
2499ARM@. Both attributes override the @option{-mlong-calls} (@pxref{ARM Options})
2500command line switch and @code{#pragma long_calls} settings. The
87c365a4
NS
2501@code{long_call} attribute indicates that the function might be far
2502away from the call site and require a different (more expensive)
2503calling sequence. The @code{short_call} attribute always places
c8619b90
NS
2504the offset to the function from the call site into the @samp{BL}
2505instruction directly.
72954a4f 2506
c8619b90
NS
2507@item longcall/shortcall
2508@cindex functions called via pointer on the RS/6000 and PowerPC
87c365a4
NS
2509On the Blackfin, RS/6000 and PowerPC, the @code{longcall} attribute
2510indicates that the function might be far away from the call site and
2511require a different (more expensive) calling sequence. The
2512@code{shortcall} attribute indicates that the function is always close
2513enough for the shorter calling sequence to be used. These attributes
2514override both the @option{-mlongcall} switch and, on the RS/6000 and
2515PowerPC, the @code{#pragma longcall} setting.
72954a4f 2516
c8619b90
NS
2517@xref{RS/6000 and PowerPC Options}, for more information on whether long
2518calls are necessary.
c1f7febf 2519
cd3a59b3 2520@item long_call/near/far
4dbdb061 2521@cindex indirect calls on MIPS
cd3a59b3
SL
2522These attributes specify how a particular function is called on MIPS@.
2523The attributes override the @option{-mlong-calls} (@pxref{MIPS Options})
2524command-line switch. The @code{long_call} and @code{far} attributes are
2525synonyms, and cause the compiler to always call
4dbdb061 2526the function by first loading its address into a register, and then using
cd3a59b3
SL
2527the contents of that register. The @code{near} attribute has the opposite
2528effect; it specifies that non-PIC calls should be made using the more
2529efficient @code{jal} instruction.
4dbdb061 2530
140592a0
AG
2531@item malloc
2532@cindex @code{malloc} attribute
2533The @code{malloc} attribute is used to tell the compiler that a function
928a5ba9
JM
2534may be treated as if any non-@code{NULL} pointer it returns cannot
2535alias any other pointer valid when the function returns.
140592a0 2536This will often improve optimization.
928a5ba9
JM
2537Standard functions with this property include @code{malloc} and
2538@code{calloc}. @code{realloc}-like functions have this property as
2539long as the old pointer is never referred to (including comparing it
2540to the new pointer) after the function returns a non-@code{NULL}
2541value.
140592a0 2542
f9e4a411
SL
2543@item mips16/nomips16
2544@cindex @code{mips16} attribute
2545@cindex @code{nomips16} attribute
2546
2547On MIPS targets, you can use the @code{mips16} and @code{nomips16}
2548function attributes to locally select or turn off MIPS16 code generation.
2549A function with the @code{mips16} attribute is emitted as MIPS16 code,
2550while MIPS16 code generation is disabled for functions with the
2551@code{nomips16} attribute. These attributes override the
2552@option{-mips16} and @option{-mno-mips16} options on the command line
2553(@pxref{MIPS Options}).
2554
2555When compiling files containing mixed MIPS16 and non-MIPS16 code, the
2556preprocessor symbol @code{__mips16} reflects the setting on the command line,
2557not that within individual functions. Mixed MIPS16 and non-MIPS16 code
2558may interact badly with some GCC extensions such as @code{__builtin_apply}
2559(@pxref{Constructing Calls}).
2560
c8619b90
NS
2561@item model (@var{model-name})
2562@cindex function addressability on the M32R/D
2563@cindex variable addressability on the IA-64
2564
2565On the M32R/D, use this attribute to set the addressability of an
2566object, and of the code generated for a function. The identifier
2567@var{model-name} is one of @code{small}, @code{medium}, or
2568@code{large}, representing each of the code models.
2569
2570Small model objects live in the lower 16MB of memory (so that their
2571addresses can be loaded with the @code{ld24} instruction), and are
2572callable with the @code{bl} instruction.
2573
2574Medium model objects may live anywhere in the 32-bit address space (the
2575compiler will generate @code{seth/add3} instructions to load their addresses),
2576and are callable with the @code{bl} instruction.
2577
2578Large model objects may live anywhere in the 32-bit address space (the
2579compiler will generate @code{seth/add3} instructions to load their addresses),
2580and may not be reachable with the @code{bl} instruction (the compiler will
2581generate the much slower @code{seth/add3/jl} instruction sequence).
2582
2583On IA-64, use this attribute to set the addressability of an object.
2584At present, the only supported identifier for @var{model-name} is
2585@code{small}, indicating addressability via ``small'' (22-bit)
2586addresses (so that their addresses can be loaded with the @code{addl}
2587instruction). Caveat: such addressing is by definition not position
2588independent and hence this attribute must not be used for objects
2589defined by shared libraries.
2590
7c800926 2591@item ms_abi/sysv_abi
f9ac6b1e 2592@cindex @code{ms_abi} attribute
7c800926
KT
2593@cindex @code{sysv_abi} attribute
2594
cdcabece 2595On 64-bit x86_64-*-* targets, you can use an ABI attribute to indicate
7c800926
KT
2596which calling convention should be used for a function. The @code{ms_abi}
2597attribute tells the compiler to use the Microsoft ABI, while the
2598@code{sysv_abi} attribute tells the compiler to use the ABI used on
2599GNU/Linux and other systems. The default is to use the Microsoft ABI
2600when targeting Windows. On all other systems, the default is the AMD ABI.
2601
2602Note, This feature is currently sorried out for Windows targets trying to
2603
c8619b90
NS
2604@item naked
2605@cindex function without a prologue/epilogue code
8d8da227 2606Use this attribute on the ARM, AVR, IP2K and SPU ports to indicate that
85d9c13c 2607the specified function does not need prologue/epilogue sequences generated by
007e61c2
PB
2608the compiler. It is up to the programmer to provide these sequences. The
2609only statements that can be safely included in naked functions are
2610@code{asm} statements that do not have operands. All other statements,
2611including declarations of local variables, @code{if} statements, and so
2612forth, should be avoided. Naked functions should be used to implement the
2613body of an assembly function, while allowing the compiler to construct
2614the requisite function declaration for the assembler.
c8619b90
NS
2615
2616@item near
2617@cindex functions which do not handle memory bank switching on 68HC11/68HC12
2618On 68HC11 and 68HC12 the @code{near} attribute causes the compiler to
2619use the normal calling convention based on @code{jsr} and @code{rts}.
2620This attribute can be used to cancel the effect of the @option{-mlong-calls}
2621option.
2622
0d4a78eb
BS
2623@item nesting
2624@cindex Allow nesting in an interrupt handler on the Blackfin processor.
2625Use this attribute together with @code{interrupt_handler},
2626@code{exception_handler} or @code{nmi_handler} to indicate that the function
2627entry code should enable nested interrupts or exceptions.
2628
2629@item nmi_handler
2630@cindex NMI handler functions on the Blackfin processor
2631Use this attribute on the Blackfin to indicate that the specified function
2632is an NMI handler. The compiler will generate function entry and
2633exit sequences suitable for use in an NMI handler when this
2634attribute is present.
2635
c8619b90
NS
2636@item no_instrument_function
2637@cindex @code{no_instrument_function} function attribute
2638@opindex finstrument-functions
2639If @option{-finstrument-functions} is given, profiling function calls will
2640be generated at entry and exit of most user-compiled functions.
2641Functions with this attribute will not be so instrumented.
2642
2643@item noinline
2644@cindex @code{noinline} function attribute
2645This function attribute prevents a function from being considered for
2646inlining.
ccd2a21e
HPN
2647@c Don't enumerate the optimizations by name here; we try to be
2648@c future-compatible with this mechanism.
2649If the function does not have side-effects, there are optimizations
2650other than inlining that causes function calls to be optimized away,
2651although the function call is live. To keep such calls from being
2652optimized away, put
2653@smallexample
2654asm ("");
2655@end smallexample
2656(@pxref{Extended Asm}) in the called function, to serve as a special
2657side-effect.
c8619b90
NS
2658
2659@item nonnull (@var{arg-index}, @dots{})
2660@cindex @code{nonnull} function attribute
2661The @code{nonnull} attribute specifies that some function parameters should
2662be non-null pointers. For instance, the declaration:
c1f7febf
RK
2663
2664@smallexample
c8619b90
NS
2665extern void *
2666my_memcpy (void *dest, const void *src, size_t len)
6ccde948 2667 __attribute__((nonnull (1, 2)));
c1f7febf
RK
2668@end smallexample
2669
c8619b90
NS
2670@noindent
2671causes the compiler to check that, in calls to @code{my_memcpy},
2672arguments @var{dest} and @var{src} are non-null. If the compiler
2673determines that a null pointer is passed in an argument slot marked
2674as non-null, and the @option{-Wnonnull} option is enabled, a warning
2675is issued. The compiler may also choose to make optimizations based
2676on the knowledge that certain function arguments will not be null.
af3e86c2 2677
c8619b90
NS
2678If no argument index list is given to the @code{nonnull} attribute,
2679all pointer arguments are marked as non-null. To illustrate, the
2680following declaration is equivalent to the previous example:
47bd70b5
JJ
2681
2682@smallexample
c8619b90
NS
2683extern void *
2684my_memcpy (void *dest, const void *src, size_t len)
6ccde948 2685 __attribute__((nonnull));
47bd70b5
JJ
2686@end smallexample
2687
c8619b90
NS
2688@item noreturn
2689@cindex @code{noreturn} function attribute
2690A few standard library functions, such as @code{abort} and @code{exit},
2691cannot return. GCC knows this automatically. Some programs define
2692their own functions that never return. You can declare them
2693@code{noreturn} to tell the compiler this fact. For example,
9e8aab55 2694
c8619b90
NS
2695@smallexample
2696@group
2697void fatal () __attribute__ ((noreturn));
d5c4db17 2698
c8619b90
NS
2699void
2700fatal (/* @r{@dots{}} */)
2701@{
2702 /* @r{@dots{}} */ /* @r{Print error message.} */ /* @r{@dots{}} */
2703 exit (1);
2704@}
2705@end group
2706@end smallexample
9e8aab55 2707
c8619b90
NS
2708The @code{noreturn} keyword tells the compiler to assume that
2709@code{fatal} cannot return. It can then optimize without regard to what
2710would happen if @code{fatal} ever did return. This makes slightly
2711better code. More importantly, it helps avoid spurious warnings of
2712uninitialized variables.
9e8aab55 2713
c8619b90
NS
2714The @code{noreturn} keyword does not affect the exceptional path when that
2715applies: a @code{noreturn}-marked function may still return to the caller
2e9522f4 2716by throwing an exception or calling @code{longjmp}.
9e8aab55 2717
c8619b90
NS
2718Do not assume that registers saved by the calling function are
2719restored before calling the @code{noreturn} function.
47bd70b5 2720
c8619b90
NS
2721It does not make sense for a @code{noreturn} function to have a return
2722type other than @code{void}.
c1f7febf 2723
c8619b90
NS
2724The attribute @code{noreturn} is not implemented in GCC versions
2725earlier than 2.5. An alternative way to declare that a function does
2726not return, which works in the current version and in some older
2727versions, is as follows:
5d34c8e9 2728
c8619b90
NS
2729@smallexample
2730typedef void voidfn ();
c1f7febf 2731
c8619b90
NS
2732volatile voidfn fatal;
2733@end smallexample
e91f04de 2734
a1e73046
PC
2735This approach does not work in GNU C++.
2736
c8619b90
NS
2737@item nothrow
2738@cindex @code{nothrow} function attribute
2739The @code{nothrow} attribute is used to inform the compiler that a
2740function cannot throw an exception. For example, most functions in
2741the standard C library can be guaranteed not to throw an exception
2742with the notable exceptions of @code{qsort} and @code{bsearch} that
2743take function pointer arguments. The @code{nothrow} attribute is not
3f3174b6 2744implemented in GCC versions earlier than 3.3.
c1f7febf 2745
ab442df7
MM
2746@item optimize
2747@cindex @code{optimize} function attribute
2748The @code{optimize} attribute is used to specify that a function is to
2749be compiled with different optimization options than specified on the
2750command line. Arguments can either be numbers or strings. Numbers
2751are assumed to be an optimization level. Strings that begin with
2752@code{O} are assumed to be an optimization option, while other options
2753are assumed to be used with a @code{-f} prefix. You can also use the
2754@samp{#pragma GCC optimize} pragma to set the optimization options
2755that affect more than one function.
2756@xref{Function Specific Option Pragmas}, for details about the
e3606f3b 2757@samp{#pragma GCC optimize} pragma.
ab442df7
MM
2758
2759This can be used for instance to have frequently executed functions
2760compiled with more aggressive optimization options that produce faster
2761and larger code, while other functions can be called with less
5779e713 2762aggressive options.
ab442df7 2763
c8619b90
NS
2764@item pure
2765@cindex @code{pure} function attribute
2766Many functions have no effects except the return value and their
2767return value depends only on the parameters and/or global variables.
2768Such a function can be subject
2769to common subexpression elimination and loop optimization just as an
2770arithmetic operator would be. These functions should be declared
2771with the attribute @code{pure}. For example,
a5c76ee6 2772
c8619b90
NS
2773@smallexample
2774int square (int) __attribute__ ((pure));
2775@end smallexample
c1f7febf 2776
c8619b90
NS
2777@noindent
2778says that the hypothetical function @code{square} is safe to call
2779fewer times than the program says.
c27ba912 2780
c8619b90
NS
2781Some of common examples of pure functions are @code{strlen} or @code{memcmp}.
2782Interesting non-pure functions are functions with infinite loops or those
2783depending on volatile memory or other system resource, that may change between
2784two consecutive calls (such as @code{feof} in a multithreading environment).
c1f7febf 2785
c8619b90
NS
2786The attribute @code{pure} is not implemented in GCC versions earlier
2787than 2.96.
c1f7febf 2788
52bf96d2
JH
2789@item hot
2790@cindex @code{hot} function attribute
2791The @code{hot} attribute is used to inform the compiler that a function is a
2792hot spot of the compiled program. The function is optimized more aggressively
2793and on many target it is placed into special subsection of the text section so
2794all hot functions appears close together improving locality.
2795
2796When profile feedback is available, via @option{-fprofile-use}, hot functions
2797are automatically detected and this attribute is ignored.
2798
ab442df7
MM
2799The @code{hot} attribute is not implemented in GCC versions earlier
2800than 4.3.
2801
52bf96d2
JH
2802@item cold
2803@cindex @code{cold} function attribute
2804The @code{cold} attribute is used to inform the compiler that a function is
2805unlikely executed. The function is optimized for size rather than speed and on
2806many targets it is placed into special subsection of the text section so all
2807cold functions appears close together improving code locality of non-cold parts
2808of program. The paths leading to call of cold functions within code are marked
44c7bd63 2809as unlikely by the branch prediction mechanism. It is thus useful to mark
52bf96d2
JH
2810functions used to handle unlikely conditions, such as @code{perror}, as cold to
2811improve optimization of hot functions that do call marked functions in rare
2812occasions.
2813
2814When profile feedback is available, via @option{-fprofile-use}, hot functions
2815are automatically detected and this attribute is ignored.
2816
ab442df7
MM
2817The @code{cold} attribute is not implemented in GCC versions earlier than 4.3.
2818
c8619b90
NS
2819@item regparm (@var{number})
2820@cindex @code{regparm} attribute
2821@cindex functions that are passed arguments in registers on the 386
2822On the Intel 386, the @code{regparm} attribute causes the compiler to
2f84b963
RG
2823pass arguments number one to @var{number} if they are of integral type
2824in registers EAX, EDX, and ECX instead of on the stack. Functions that
2825take a variable number of arguments will continue to be passed all of their
c8619b90 2826arguments on the stack.
6d3d9133 2827
c8619b90
NS
2828Beware that on some ELF systems this attribute is unsuitable for
2829global functions in shared libraries with lazy binding (which is the
2830default). Lazy binding will send the first call via resolving code in
2831the loader, which might assume EAX, EDX and ECX can be clobbered, as
2832per the standard calling conventions. Solaris 8 is affected by this.
2833GNU systems with GLIBC 2.1 or higher, and FreeBSD, are believed to be
21440b2d 2834safe since the loaders there save EAX, EDX and ECX. (Lazy binding can be
c8619b90
NS
2835disabled with the linker or the loader if desired, to avoid the
2836problem.)
6d3d9133 2837
2f84b963
RG
2838@item sseregparm
2839@cindex @code{sseregparm} attribute
2840On the Intel 386 with SSE support, the @code{sseregparm} attribute
56829cae 2841causes the compiler to pass up to 3 floating point arguments in
2f84b963
RG
2842SSE registers instead of on the stack. Functions that take a
2843variable number of arguments will continue to pass all of their
2844floating point arguments on the stack.
2845
33932946
SH
2846@item force_align_arg_pointer
2847@cindex @code{force_align_arg_pointer} attribute
2848On the Intel x86, the @code{force_align_arg_pointer} attribute may be
2849applied to individual function definitions, generating an alternate
2e3f842f
L
2850prologue and epilogue that realigns the runtime stack if necessary.
2851This supports mixing legacy codes that run with a 4-byte aligned stack
2852with modern codes that keep a 16-byte stack for SSE compatibility.
33932946 2853
561642fa
AP
2854@item resbank
2855@cindex @code{resbank} attribute
2856On the SH2A target, this attribute enables the high-speed register
2857saving and restoration using a register bank for @code{interrupt_handler}
a640c13b 2858routines. Saving to the bank is performed automatically after the CPU
561642fa
AP
2859accepts an interrupt that uses a register bank.
2860
2861The nineteen 32-bit registers comprising general register R0 to R14,
2862control register GBR, and system registers MACH, MACL, and PR and the
2863vector table address offset are saved into a register bank. Register
2864banks are stacked in first-in last-out (FILO) sequence. Restoration
2865from the bank is executed by issuing a RESBANK instruction.
2866
6e9a3221
AN
2867@item returns_twice
2868@cindex @code{returns_twice} attribute
2869The @code{returns_twice} attribute tells the compiler that a function may
2870return more than one time. The compiler will ensure that all registers
2871are dead before calling such a function and will emit a warning about
2872the variables that may be clobbered after the second return from the
2873function. Examples of such functions are @code{setjmp} and @code{vfork}.
2874The @code{longjmp}-like counterpart of such function, if any, might need
2875to be marked with the @code{noreturn} attribute.
2876
c8619b90 2877@item saveall
0d4a78eb
BS
2878@cindex save all registers on the Blackfin, H8/300, H8/300H, and H8S
2879Use this attribute on the Blackfin, H8/300, H8/300H, and H8S to indicate that
c8619b90
NS
2880all registers except the stack pointer should be saved in the prologue
2881regardless of whether they are used or not.
6d3d9133 2882
c8619b90
NS
2883@item section ("@var{section-name}")
2884@cindex @code{section} function attribute
2885Normally, the compiler places the code it generates in the @code{text} section.
2886Sometimes, however, you need additional sections, or you need certain
2887particular functions to appear in special sections. The @code{section}
2888attribute specifies that a function lives in a particular section.
2889For example, the declaration:
6d3d9133
NC
2890
2891@smallexample
c8619b90 2892extern void foobar (void) __attribute__ ((section ("bar")));
6d3d9133
NC
2893@end smallexample
2894
c8619b90
NS
2895@noindent
2896puts the function @code{foobar} in the @code{bar} section.
6d3d9133 2897
c8619b90
NS
2898Some file formats do not support arbitrary sections so the @code{section}
2899attribute is not available on all platforms.
2900If you need to map the entire contents of a module to a particular
2901section, consider using the facilities of the linker instead.
2902
3d091dac
KG
2903@item sentinel
2904@cindex @code{sentinel} function attribute
254986c7
KG
2905This function attribute ensures that a parameter in a function call is
2906an explicit @code{NULL}. The attribute is only valid on variadic
2907functions. By default, the sentinel is located at position zero, the
2908last parameter of the function call. If an optional integer position
2909argument P is supplied to the attribute, the sentinel must be located at
2910position P counting backwards from the end of the argument list.
2911
2912@smallexample
2913__attribute__ ((sentinel))
2914is equivalent to
2915__attribute__ ((sentinel(0)))
2916@end smallexample
2917
2918The attribute is automatically set with a position of 0 for the built-in
2919functions @code{execl} and @code{execlp}. The built-in function
254ea84c 2920@code{execle} has the attribute set with a position of 1.
254986c7
KG
2921
2922A valid @code{NULL} in this context is defined as zero with any pointer
2923type. If your system defines the @code{NULL} macro with an integer type
2924then you need to add an explicit cast. GCC replaces @code{stddef.h}
2925with a copy that redefines NULL appropriately.
2926
2927The warnings for missing or incorrect sentinels are enabled with
2928@option{-Wformat}.
3d091dac 2929
c8619b90
NS
2930@item short_call
2931See long_call/short_call.
2932
2933@item shortcall
2934See longcall/shortcall.
2935
2936@item signal
2937@cindex signal handler functions on the AVR processors
2938Use this attribute on the AVR to indicate that the specified
2939function is a signal handler. The compiler will generate function
2940entry and exit sequences suitable for use in a signal handler when this
2941attribute is present. Interrupts will be disabled inside the function.
b93e3893
AO
2942
2943@item sp_switch
88ab0d1c 2944Use this attribute on the SH to indicate an @code{interrupt_handler}
b93e3893
AO
2945function should switch to an alternate stack. It expects a string
2946argument that names a global variable holding the address of the
2947alternate stack.
2948
2949@smallexample
2950void *alt_stack;
aee96fe9
JM
2951void f () __attribute__ ((interrupt_handler,
2952 sp_switch ("alt_stack")));
b93e3893
AO
2953@end smallexample
2954
c8619b90
NS
2955@item stdcall
2956@cindex functions that pop the argument stack on the 386
2957On the Intel 386, the @code{stdcall} attribute causes the compiler to
2958assume that the called function will pop off the stack space used to
2959pass arguments, unless it takes a variable number of arguments.
c1f7febf 2960
4b84f3de
SE
2961@item syscall_linkage
2962@cindex @code{syscall_linkage} attribute
2963This attribute is used to modify the IA64 calling convention by marking
2964all input registers as live at all function exits. This makes it possible
2965to restart a system call after an interrupt without having to save/restore
2966the input registers. This also prevents kernel data from leaking into
2967application code.
2968
1df48f5c
JW
2969@item target
2970@cindex @code{target} function attribute
2971The @code{target} attribute is used to specify that a function is to
2972be compiled with different target options than specified on the
2973command line. This can be used for instance to have functions
2974compiled with a different ISA (instruction set architecture) than the
2975default. You can also use the @samp{#pragma GCC target} pragma to set
2976more than one function to be compiled with specific target options.
2977@xref{Function Specific Option Pragmas}, for details about the
2978@samp{#pragma GCC target} pragma.
2979
2980For instance on a 386, you could compile one function with
2981@code{target("sse4.1,arch=core2")} and another with
2982@code{target("sse4a,arch=amdfam10")} that would be equivalent to
2983compiling the first function with @option{-msse4.1} and
2984@option{-march=core2} options, and the second function with
2985@option{-msse4a} and @option{-march=amdfam10} options. It is up to the
2986user to make sure that a function is only invoked on a machine that
2987supports the particular ISA it was compiled for (for example by using
2988@code{cpuid} on 386 to determine what feature bits and architecture
2989family are used).
2990
2991@smallexample
2992int core2_func (void) __attribute__ ((__target__ ("arch=core2")));
2993int sse3_func (void) __attribute__ ((__target__ ("sse3")));
2994@end smallexample
2995
2996On the 386, the following options are allowed:
2997
2998@table @samp
2999@item abm
3000@itemx no-abm
3001@cindex @code{target("abm")} attribute
3002Enable/disable the generation of the advanced bit instructions.
3003
3004@item aes
3005@itemx no-aes
3006@cindex @code{target("aes")} attribute
3007Enable/disable the generation of the AES instructions.
3008
3009@item mmx
3010@itemx no-mmx
3011@cindex @code{target("mmx")} attribute
3012Enable/disable the generation of the MMX instructions.
3013
3014@item pclmul
3015@itemx no-pclmul
3016@cindex @code{target("pclmul")} attribute
3017Enable/disable the generation of the PCLMUL instructions.
3018
3019@item popcnt
3020@itemx no-popcnt
3021@cindex @code{target("popcnt")} attribute
3022Enable/disable the generation of the POPCNT instruction.
3023
3024@item sse
3025@itemx no-sse
3026@cindex @code{target("sse")} attribute
3027Enable/disable the generation of the SSE instructions.
3028
3029@item sse2
3030@itemx no-sse2
3031@cindex @code{target("sse2")} attribute
3032Enable/disable the generation of the SSE2 instructions.
3033
3034@item sse3
3035@itemx no-sse3
3036@cindex @code{target("sse3")} attribute
3037Enable/disable the generation of the SSE3 instructions.
3038
3039@item sse4
3040@itemx no-sse4
3041@cindex @code{target("sse4")} attribute
3042Enable/disable the generation of the SSE4 instructions (both SSE4.1
3043and SSE4.2).
3044
3045@item sse4.1
3046@itemx no-sse4.1
3047@cindex @code{target("sse4.1")} attribute
3048Enable/disable the generation of the sse4.1 instructions.
3049
3050@item sse4.2
3051@itemx no-sse4.2
3052@cindex @code{target("sse4.2")} attribute
3053Enable/disable the generation of the sse4.2 instructions.
3054
3055@item sse4a
3056@itemx no-sse4a
3057@cindex @code{target("sse4a")} attribute
3058Enable/disable the generation of the SSE4A instructions.
3059
3060@item sse5
3061@itemx no-sse5
3062@cindex @code{target("sse5")} attribute
3063Enable/disable the generation of the SSE5 instructions.
3064
3065@item ssse3
3066@itemx no-ssse3
3067@cindex @code{target("ssse3")} attribute
3068Enable/disable the generation of the SSSE3 instructions.
3069
3070@item cld
3071@itemx no-cld
3072@cindex @code{target("cld")} attribute
3073Enable/disable the generation of the CLD before string moves.
3074
3075@item fancy-math-387
3076@itemx no-fancy-math-387
3077@cindex @code{target("fancy-math-387")} attribute
3078Enable/disable the generation of the @code{sin}, @code{cos}, and
3079@code{sqrt} instructions on the 387 floating point unit.
3080
3081@item fused-madd
3082@itemx no-fused-madd
3083@cindex @code{target("fused-madd")} attribute
3084Enable/disable the generation of the fused multiply/add instructions.
3085
3086@item ieee-fp
3087@itemx no-ieee-fp
3088@cindex @code{target("ieee-fp")} attribute
3089Enable/disable the generation of floating point that depends on IEEE arithmetic.
3090
3091@item inline-all-stringops
3092@itemx no-inline-all-stringops
3093@cindex @code{target("inline-all-stringops")} attribute
3094Enable/disable inlining of string operations.
3095
3096@item inline-stringops-dynamically
3097@itemx no-inline-stringops-dynamically
3098@cindex @code{target("inline-stringops-dynamically")} attribute
3099Enable/disable the generation of the inline code to do small string
3100operations and calling the library routines for large operations.
3101
3102@item align-stringops
3103@itemx no-align-stringops
3104@cindex @code{target("align-stringops")} attribute
3105Do/do not align destination of inlined string operations.
3106
3107@item recip
3108@itemx no-recip
3109@cindex @code{target("recip")} attribute
3110Enable/disable the generation of RCPSS, RCPPS, RSQRTSS and RSQRTPS
048fd785 3111instructions followed an additional Newton-Raphson step instead of
1df48f5c
JW
3112doing a floating point division.
3113
3114@item arch=@var{ARCH}
3115@cindex @code{target("arch=@var{ARCH}")} attribute
3116Specify the architecture to generate code for in compiling the function.
3117
3118@item tune=@var{TUNE}
3119@cindex @code{target("tune=@var{TUNE}")} attribute
3120Specify the architecture to tune for in compiling the function.
3121
3122@item fpmath=@var{FPMATH}
3123@cindex @code{target("fpmath=@var{FPMATH}")} attribute
3124Specify which floating point unit to use. The
3125@code{target("fpmath=sse,387")} option must be specified as
3126@code{target("fpmath=sse+387")} because the comma would separate
3127different options.
3128@end table
3129
3130On the 386, you can use either multiple strings to specify multiple
3131options, or you can separate the option with a comma (@code{,}).
3132
3133On the 386, the inliner will not inline a function that has different
3134target options than the caller, unless the callee has a subset of the
3135target options of the caller. For example a function declared with
3136@code{target("sse5")} can inline a function with
3137@code{target("sse2")}, since @code{-msse5} implies @code{-msse2}.
3138
3139The @code{target} attribute is not implemented in GCC versions earlier
3140than 4.4, and at present only the 386 uses it.
3141
c1f7febf 3142@item tiny_data
dbacaa98
KH
3143@cindex tiny data section on the H8/300H and H8S
3144Use this attribute on the H8/300H and H8S to indicate that the specified
c1f7febf
RK
3145variable should be placed into the tiny data section.
3146The compiler will generate more efficient code for loads and stores
3147on data in the tiny data section. Note the tiny data area is limited to
3148slightly under 32kbytes of data.
845da534 3149
c8619b90
NS
3150@item trap_exit
3151Use this attribute on the SH for an @code{interrupt_handler} to return using
3152@code{trapa} instead of @code{rte}. This attribute expects an integer
3153argument specifying the trap number to be used.
845da534 3154
c8619b90
NS
3155@item unused
3156@cindex @code{unused} attribute.
3157This attribute, attached to a function, means that the function is meant
3158to be possibly unused. GCC will not produce a warning for this
3159function.
a32767e4 3160
c8619b90
NS
3161@item used
3162@cindex @code{used} attribute.
3163This attribute, attached to a function, means that code must be emitted
3164for the function even if it appears that the function is not referenced.
3165This is useful, for example, when the function is referenced only in
3166inline assembly.
5936c7e7 3167
812b587e 3168@item version_id
4b84f3de
SE
3169@cindex @code{version_id} attribute
3170This IA64 HP-UX attribute, attached to a global variable or function, renames a
812b587e
SE
3171symbol to contain a version string, thus allowing for function level
3172versioning. HP-UX system header files may use version level functioning
3173for some system calls.
3174
3175@smallexample
3176extern int foo () __attribute__((version_id ("20040821")));
3177@end smallexample
3178
3179Calls to @var{foo} will be mapped to calls to @var{foo@{20040821@}}.
3180
c8619b90
NS
3181@item visibility ("@var{visibility_type}")
3182@cindex @code{visibility} attribute
46bdbc00
GK
3183This attribute affects the linkage of the declaration to which it is attached.
3184There are four supported @var{visibility_type} values: default,
3185hidden, protected or internal visibility.
5936c7e7 3186
c8619b90
NS
3187@smallexample
3188void __attribute__ ((visibility ("protected")))
3189f () @{ /* @r{Do something.} */; @}
3190int i __attribute__ ((visibility ("hidden")));
3191@end smallexample
5936c7e7 3192
46bdbc00
GK
3193The possible values of @var{visibility_type} correspond to the
3194visibility settings in the ELF gABI.
5936c7e7 3195
c8619b90 3196@table @dfn
63c5b495 3197@c keep this list of visibilities in alphabetical order.
6b6cb52e 3198
c8619b90 3199@item default
46bdbc00
GK
3200Default visibility is the normal case for the object file format.
3201This value is available for the visibility attribute to override other
3202options that may change the assumed visibility of entities.
3203
3204On ELF, default visibility means that the declaration is visible to other
3205modules and, in shared libraries, means that the declared entity may be
3206overridden.
3207
3208On Darwin, default visibility means that the declaration is visible to
3209other modules.
3210
3211Default visibility corresponds to ``external linkage'' in the language.
6b6cb52e 3212
c8619b90 3213@item hidden
46bdbc00
GK
3214Hidden visibility indicates that the entity declared will have a new
3215form of linkage, which we'll call ``hidden linkage''. Two
3216declarations of an object with hidden linkage refer to the same object
3217if they are in the same shared object.
6b6cb52e 3218
c8619b90
NS
3219@item internal
3220Internal visibility is like hidden visibility, but with additional
46bdbc00
GK
3221processor specific semantics. Unless otherwise specified by the
3222psABI, GCC defines internal visibility to mean that a function is
3223@emph{never} called from another module. Compare this with hidden
3224functions which, while they cannot be referenced directly by other
3225modules, can be referenced indirectly via function pointers. By
3226indicating that a function cannot be called from outside the module,
3227GCC may for instance omit the load of a PIC register since it is known
3228that the calling function loaded the correct value.
6b6cb52e 3229
c8619b90 3230@item protected
46bdbc00
GK
3231Protected visibility is like default visibility except that it
3232indicates that references within the defining module will bind to the
3233definition in that module. That is, the declared entity cannot be
3234overridden by another module.
6b6cb52e 3235
c8619b90 3236@end table
6b6cb52e 3237
46bdbc00
GK
3238All visibilities are supported on many, but not all, ELF targets
3239(supported when the assembler supports the @samp{.visibility}
3240pseudo-op). Default visibility is supported everywhere. Hidden
3241visibility is supported on Darwin targets.
3242
3243The visibility attribute should be applied only to declarations which
3244would otherwise have external linkage. The attribute should be applied
3245consistently, so that the same entity should not be declared with
3246different settings of the attribute.
3247
3248In C++, the visibility attribute applies to types as well as functions
b9e75696
JM
3249and objects, because in C++ types have linkage. A class must not have
3250greater visibility than its non-static data member types and bases,
3251and class members default to the visibility of their class. Also, a
b70f0f48
JM
3252declaration without explicit visibility is limited to the visibility
3253of its type.
46bdbc00
GK
3254
3255In C++, you can mark member functions and static member variables of a
d1facce0 3256class with the visibility attribute. This is useful if you know a
46bdbc00
GK
3257particular method or static member variable should only be used from
3258one shared object; then you can mark it hidden while the rest of the
3259class has default visibility. Care must be taken to avoid breaking
b70f0f48
JM
3260the One Definition Rule; for example, it is usually not useful to mark
3261an inline method as hidden without marking the whole class as hidden.
6b6cb52e 3262
b9e75696
JM
3263A C++ namespace declaration can also have the visibility attribute.
3264This attribute applies only to the particular namespace body, not to
3265other definitions of the same namespace; it is equivalent to using
3266@samp{#pragma GCC visibility} before and after the namespace
3267definition (@pxref{Visibility Pragmas}).
3268
3269In C++, if a template argument has limited visibility, this
3270restriction is implicitly propagated to the template instantiation.
3271Otherwise, template instantiations and specializations default to the
3272visibility of their template.
3273
b70f0f48
JM
3274If both the template and enclosing class have explicit visibility, the
3275visibility from the template is used.
3276
c8619b90
NS
3277@item warn_unused_result
3278@cindex @code{warn_unused_result} attribute
3279The @code{warn_unused_result} attribute causes a warning to be emitted
3280if a caller of the function with this attribute does not use its
3281return value. This is useful for functions where not checking
3282the result is either a security problem or always a bug, such as
3283@code{realloc}.
6b6cb52e 3284
c8619b90
NS
3285@smallexample
3286int fn () __attribute__ ((warn_unused_result));
3287int foo ()
3288@{
3289 if (fn () < 0) return -1;
3290 fn ();
3291 return 0;
3292@}
3293@end smallexample
6b6cb52e 3294
c8619b90 3295results in warning on line 5.
6b6cb52e 3296
c8619b90
NS
3297@item weak
3298@cindex @code{weak} attribute
3299The @code{weak} attribute causes the declaration to be emitted as a weak
3300symbol rather than a global. This is primarily useful in defining
3301library functions which can be overridden in user code, though it can
3302also be used with non-function declarations. Weak symbols are supported
3303for ELF targets, and also for a.out targets when using the GNU assembler
3304and linker.
6b6cb52e 3305
a0203ca7
AO
3306@item weakref
3307@itemx weakref ("@var{target}")
3308@cindex @code{weakref} attribute
3309The @code{weakref} attribute marks a declaration as a weak reference.
3310Without arguments, it should be accompanied by an @code{alias} attribute
3311naming the target symbol. Optionally, the @var{target} may be given as
3312an argument to @code{weakref} itself. In either case, @code{weakref}
3313implicitly marks the declaration as @code{weak}. Without a
3314@var{target}, given as an argument to @code{weakref} or to @code{alias},
3315@code{weakref} is equivalent to @code{weak}.
3316
3317@smallexample
a9b0b825 3318static int x() __attribute__ ((weakref ("y")));
a0203ca7 3319/* is equivalent to... */
a9b0b825 3320static int x() __attribute__ ((weak, weakref, alias ("y")));
a0203ca7 3321/* and to... */
a9b0b825
GK
3322static int x() __attribute__ ((weakref));
3323static int x() __attribute__ ((alias ("y")));
a0203ca7
AO
3324@end smallexample
3325
3326A weak reference is an alias that does not by itself require a
3327definition to be given for the target symbol. If the target symbol is
3328only referenced through weak references, then the becomes a @code{weak}
3329undefined symbol. If it is directly referenced, however, then such
3330strong references prevail, and a definition will be required for the
3331symbol, not necessarily in the same translation unit.
3332
3333The effect is equivalent to moving all references to the alias to a
3334separate translation unit, renaming the alias to the aliased symbol,
3335declaring it as weak, compiling the two separate translation units and
3336performing a reloadable link on them.
3337
a9b0b825
GK
3338At present, a declaration to which @code{weakref} is attached can
3339only be @code{static}.
3340
c1f7febf
RK
3341@end table
3342
3343You can specify multiple attributes in a declaration by separating them
3344by commas within the double parentheses or by immediately following an
3345attribute declaration with another attribute declaration.
3346
3347@cindex @code{#pragma}, reason for not using
3348@cindex pragma, reason for not using
9f1bbeaa
JM
3349Some people object to the @code{__attribute__} feature, suggesting that
3350ISO C's @code{#pragma} should be used instead. At the time
3351@code{__attribute__} was designed, there were two reasons for not doing
3352this.
c1f7febf
RK
3353
3354@enumerate
3355@item
3356It is impossible to generate @code{#pragma} commands from a macro.
3357
3358@item
3359There is no telling what the same @code{#pragma} might mean in another
3360compiler.
3361@end enumerate
3362
9f1bbeaa
JM
3363These two reasons applied to almost any application that might have been
3364proposed for @code{#pragma}. It was basically a mistake to use
3365@code{#pragma} for @emph{anything}.
3366
3367The ISO C99 standard includes @code{_Pragma}, which now allows pragmas
3368to be generated from macros. In addition, a @code{#pragma GCC}
3369namespace is now in use for GCC-specific pragmas. However, it has been
3370found convenient to use @code{__attribute__} to achieve a natural
3371attachment of attributes to their corresponding declarations, whereas
3372@code{#pragma GCC} is of use for constructs that do not naturally form
3373part of the grammar. @xref{Other Directives,,Miscellaneous
48795525 3374Preprocessing Directives, cpp, The GNU C Preprocessor}.
c1f7febf 3375
2c5e91d2
JM
3376@node Attribute Syntax
3377@section Attribute Syntax
3378@cindex attribute syntax
3379
3380This section describes the syntax with which @code{__attribute__} may be
3381used, and the constructs to which attribute specifiers bind, for the C
161d7b59 3382language. Some details may vary for C++ and Objective-C@. Because of
2c5e91d2
JM
3383infelicities in the grammar for attributes, some forms described here
3384may not be successfully parsed in all cases.
3385
91d231cb
JM
3386There are some problems with the semantics of attributes in C++. For
3387example, there are no manglings for attributes, although they may affect
3388code generation, so problems may arise when attributed types are used in
3389conjunction with templates or overloading. Similarly, @code{typeid}
3390does not distinguish between types with different attributes. Support
3391for attributes in C++ may be restricted in future to attributes on
3392declarations only, but not on nested declarators.
3393
2c5e91d2
JM
3394@xref{Function Attributes}, for details of the semantics of attributes
3395applying to functions. @xref{Variable Attributes}, for details of the
3396semantics of attributes applying to variables. @xref{Type Attributes},
3397for details of the semantics of attributes applying to structure, union
3398and enumerated types.
3399
3400An @dfn{attribute specifier} is of the form
3401@code{__attribute__ ((@var{attribute-list}))}. An @dfn{attribute list}
3402is a possibly empty comma-separated sequence of @dfn{attributes}, where
3403each attribute is one of the following:
3404
3405@itemize @bullet
3406@item
3407Empty. Empty attributes are ignored.
3408
3409@item
3410A word (which may be an identifier such as @code{unused}, or a reserved
3411word such as @code{const}).
3412
3413@item
3414A word, followed by, in parentheses, parameters for the attribute.
3415These parameters take one of the following forms:
3416
3417@itemize @bullet
3418@item
3419An identifier. For example, @code{mode} attributes use this form.
3420
3421@item
3422An identifier followed by a comma and a non-empty comma-separated list
3423of expressions. For example, @code{format} attributes use this form.
3424
3425@item
3426A possibly empty comma-separated list of expressions. For example,
3427@code{format_arg} attributes use this form with the list being a single
3428integer constant expression, and @code{alias} attributes use this form
3429with the list being a single string constant.
3430@end itemize
3431@end itemize
3432
3433An @dfn{attribute specifier list} is a sequence of one or more attribute
3434specifiers, not separated by any other tokens.
3435
50fc59e7 3436In GNU C, an attribute specifier list may appear after the colon following a
2c5e91d2
JM
3437label, other than a @code{case} or @code{default} label. The only
3438attribute it makes sense to use after a label is @code{unused}. This
3439feature is intended for code generated by programs which contains labels
3440that may be unused but which is compiled with @option{-Wall}. It would
3441not normally be appropriate to use in it human-written code, though it
3442could be useful in cases where the code that jumps to the label is
5bca4e80
ILT
3443contained within an @code{#ifdef} conditional. GNU C++ only permits
3444attributes on labels if the attribute specifier is immediately
3445followed by a semicolon (i.e., the label applies to an empty
3446statement). If the semicolon is missing, C++ label attributes are
3447ambiguous, as it is permissible for a declaration, which could begin
3448with an attribute list, to be labelled in C++. Declarations cannot be
3449labelled in C90 or C99, so the ambiguity does not arise there.
2c5e91d2
JM
3450
3451An attribute specifier list may appear as part of a @code{struct},
3452@code{union} or @code{enum} specifier. It may go either immediately
3453after the @code{struct}, @code{union} or @code{enum} keyword, or after
b9e75696 3454the closing brace. The former syntax is preferred.
2c5e91d2
JM
3455Where attribute specifiers follow the closing brace, they are considered
3456to relate to the structure, union or enumerated type defined, not to any
3457enclosing declaration the type specifier appears in, and the type
3458defined is not complete until after the attribute specifiers.
3459@c Otherwise, there would be the following problems: a shift/reduce
4fe9b91c 3460@c conflict between attributes binding the struct/union/enum and
2c5e91d2
JM
3461@c binding to the list of specifiers/qualifiers; and "aligned"
3462@c attributes could use sizeof for the structure, but the size could be
3463@c changed later by "packed" attributes.
3464
3465Otherwise, an attribute specifier appears as part of a declaration,
3466counting declarations of unnamed parameters and type names, and relates
3467to that declaration (which may be nested in another declaration, for
91d231cb
JM
3468example in the case of a parameter declaration), or to a particular declarator
3469within a declaration. Where an
ff867905
JM
3470attribute specifier is applied to a parameter declared as a function or
3471an array, it should apply to the function or array rather than the
3472pointer to which the parameter is implicitly converted, but this is not
3473yet correctly implemented.
2c5e91d2
JM
3474
3475Any list of specifiers and qualifiers at the start of a declaration may
3476contain attribute specifiers, whether or not such a list may in that
3477context contain storage class specifiers. (Some attributes, however,
3478are essentially in the nature of storage class specifiers, and only make
3479sense where storage class specifiers may be used; for example,
3480@code{section}.) There is one necessary limitation to this syntax: the
3481first old-style parameter declaration in a function definition cannot
3482begin with an attribute specifier, because such an attribute applies to
3483the function instead by syntax described below (which, however, is not
3484yet implemented in this case). In some other cases, attribute
3485specifiers are permitted by this grammar but not yet supported by the
3486compiler. All attribute specifiers in this place relate to the
c771326b 3487declaration as a whole. In the obsolescent usage where a type of
2c5e91d2
JM
3488@code{int} is implied by the absence of type specifiers, such a list of
3489specifiers and qualifiers may be an attribute specifier list with no
3490other specifiers or qualifiers.
3491
7dcb0442
JM
3492At present, the first parameter in a function prototype must have some
3493type specifier which is not an attribute specifier; this resolves an
3494ambiguity in the interpretation of @code{void f(int
3495(__attribute__((foo)) x))}, but is subject to change. At present, if
3496the parentheses of a function declarator contain only attributes then
3497those attributes are ignored, rather than yielding an error or warning
3498or implying a single parameter of type int, but this is subject to
3499change.
3500
2c5e91d2
JM
3501An attribute specifier list may appear immediately before a declarator
3502(other than the first) in a comma-separated list of declarators in a
3503declaration of more than one identifier using a single list of
4b01f8d8 3504specifiers and qualifiers. Such attribute specifiers apply
9c34dbbf
ZW
3505only to the identifier before whose declarator they appear. For
3506example, in
3507
3508@smallexample
3509__attribute__((noreturn)) void d0 (void),
3510 __attribute__((format(printf, 1, 2))) d1 (const char *, ...),
3511 d2 (void)
3512@end smallexample
3513
3514@noindent
3515the @code{noreturn} attribute applies to all the functions
4b01f8d8 3516declared; the @code{format} attribute only applies to @code{d1}.
2c5e91d2
JM
3517
3518An attribute specifier list may appear immediately before the comma,
3519@code{=} or semicolon terminating the declaration of an identifier other
770a9950
JM
3520than a function definition. Such attribute specifiers apply
3521to the declared object or function. Where an
9c34dbbf 3522assembler name for an object or function is specified (@pxref{Asm
770a9950
JM
3523Labels}), the attribute must follow the @code{asm}
3524specification.
2c5e91d2
JM
3525
3526An attribute specifier list may, in future, be permitted to appear after
3527the declarator in a function definition (before any old-style parameter
3528declarations or the function body).
3529
0e03329a
JM
3530Attribute specifiers may be mixed with type qualifiers appearing inside
3531the @code{[]} of a parameter array declarator, in the C99 construct by
3532which such qualifiers are applied to the pointer to which the array is
3533implicitly converted. Such attribute specifiers apply to the pointer,
3534not to the array, but at present this is not implemented and they are
3535ignored.
3536
2c5e91d2
JM
3537An attribute specifier list may appear at the start of a nested
3538declarator. At present, there are some limitations in this usage: the
91d231cb
JM
3539attributes correctly apply to the declarator, but for most individual
3540attributes the semantics this implies are not implemented.
3541When attribute specifiers follow the @code{*} of a pointer
4b01f8d8 3542declarator, they may be mixed with any type qualifiers present.
91d231cb 3543The following describes the formal semantics of this syntax. It will make the
2c5e91d2
JM
3544most sense if you are familiar with the formal specification of
3545declarators in the ISO C standard.
3546
3547Consider (as in C99 subclause 6.7.5 paragraph 4) a declaration @code{T
3548D1}, where @code{T} contains declaration specifiers that specify a type
3549@var{Type} (such as @code{int}) and @code{D1} is a declarator that
3550contains an identifier @var{ident}. The type specified for @var{ident}
3551for derived declarators whose type does not include an attribute
3552specifier is as in the ISO C standard.
3553
3554If @code{D1} has the form @code{( @var{attribute-specifier-list} D )},
3555and the declaration @code{T D} specifies the type
3556``@var{derived-declarator-type-list} @var{Type}'' for @var{ident}, then
3557@code{T D1} specifies the type ``@var{derived-declarator-type-list}
3558@var{attribute-specifier-list} @var{Type}'' for @var{ident}.
3559
3560If @code{D1} has the form @code{*
3561@var{type-qualifier-and-attribute-specifier-list} D}, and the
3562declaration @code{T D} specifies the type
3563``@var{derived-declarator-type-list} @var{Type}'' for @var{ident}, then
3564@code{T D1} specifies the type ``@var{derived-declarator-type-list}
3565@var{type-qualifier-and-attribute-specifier-list} @var{Type}'' for
3566@var{ident}.
3567
f282ffb3 3568For example,
9c34dbbf
ZW
3569
3570@smallexample
3571void (__attribute__((noreturn)) ****f) (void);
3572@end smallexample
3573
3574@noindent
3575specifies the type ``pointer to pointer to pointer to pointer to
3576non-returning function returning @code{void}''. As another example,
3577
3578@smallexample
3579char *__attribute__((aligned(8))) *f;
3580@end smallexample
3581
3582@noindent
3583specifies the type ``pointer to 8-byte-aligned pointer to @code{char}''.
91d231cb
JM
3584Note again that this does not work with most attributes; for example,
3585the usage of @samp{aligned} and @samp{noreturn} attributes given above
3586is not yet supported.
3587
3588For compatibility with existing code written for compiler versions that
3589did not implement attributes on nested declarators, some laxity is
3590allowed in the placing of attributes. If an attribute that only applies
3591to types is applied to a declaration, it will be treated as applying to
3592the type of that declaration. If an attribute that only applies to
3593declarations is applied to the type of a declaration, it will be treated
3594as applying to that declaration; and, for compatibility with code
3595placing the attributes immediately before the identifier declared, such
3596an attribute applied to a function return type will be treated as
3597applying to the function type, and such an attribute applied to an array
3598element type will be treated as applying to the array type. If an
3599attribute that only applies to function types is applied to a
3600pointer-to-function type, it will be treated as applying to the pointer
3601target type; if such an attribute is applied to a function return type
3602that is not a pointer-to-function type, it will be treated as applying
3603to the function type.
2c5e91d2 3604
c1f7febf
RK
3605@node Function Prototypes
3606@section Prototypes and Old-Style Function Definitions
3607@cindex function prototype declarations
3608@cindex old-style function definitions
3609@cindex promotion of formal parameters
3610
5490d604 3611GNU C extends ISO C to allow a function prototype to override a later
c1f7febf
RK
3612old-style non-prototype definition. Consider the following example:
3613
3ab51846 3614@smallexample
c1f7febf 3615/* @r{Use prototypes unless the compiler is old-fashioned.} */
d863830b 3616#ifdef __STDC__
c1f7febf
RK
3617#define P(x) x
3618#else
3619#define P(x) ()
3620#endif
3621
3622/* @r{Prototype function declaration.} */
3623int isroot P((uid_t));
3624
3625/* @r{Old-style function definition.} */
3626int
12bcfaa1 3627isroot (x) /* @r{??? lossage here ???} */
c1f7febf
RK
3628 uid_t x;
3629@{
3630 return x == 0;
3631@}
3ab51846 3632@end smallexample
c1f7febf 3633
5490d604 3634Suppose the type @code{uid_t} happens to be @code{short}. ISO C does
c1f7febf
RK
3635not allow this example, because subword arguments in old-style
3636non-prototype definitions are promoted. Therefore in this example the
3637function definition's argument is really an @code{int}, which does not
3638match the prototype argument type of @code{short}.
3639
5490d604 3640This restriction of ISO C makes it hard to write code that is portable
c1f7febf
RK
3641to traditional C compilers, because the programmer does not know
3642whether the @code{uid_t} type is @code{short}, @code{int}, or
3643@code{long}. Therefore, in cases like these GNU C allows a prototype
3644to override a later old-style definition. More precisely, in GNU C, a
3645function prototype argument type overrides the argument type specified
3646by a later old-style definition if the former type is the same as the
3647latter type before promotion. Thus in GNU C the above example is
3648equivalent to the following:
3649
3ab51846 3650@smallexample
c1f7febf
RK
3651int isroot (uid_t);
3652
3653int
3654isroot (uid_t x)
3655@{
3656 return x == 0;
3657@}
3ab51846 3658@end smallexample
c1f7febf 3659
9c34dbbf 3660@noindent
c1f7febf
RK
3661GNU C++ does not support old-style function definitions, so this
3662extension is irrelevant.
3663
3664@node C++ Comments
3665@section C++ Style Comments
3666@cindex //
3667@cindex C++ comments
3668@cindex comments, C++ style
3669
3670In GNU C, you may use C++ style comments, which start with @samp{//} and
3671continue until the end of the line. Many other C implementations allow
f458d1d5
ZW
3672such comments, and they are included in the 1999 C standard. However,
3673C++ style comments are not recognized if you specify an @option{-std}
3674option specifying a version of ISO C before C99, or @option{-ansi}
3675(equivalent to @option{-std=c89}).
c1f7febf
RK
3676
3677@node Dollar Signs
3678@section Dollar Signs in Identifier Names
3679@cindex $
3680@cindex dollar signs in identifier names
3681@cindex identifier names, dollar signs in
3682
79188db9
RK
3683In GNU C, you may normally use dollar signs in identifier names.
3684This is because many traditional C implementations allow such identifiers.
3685However, dollar signs in identifiers are not supported on a few target
3686machines, typically because the target assembler does not allow them.
c1f7febf
RK
3687
3688@node Character Escapes
3689@section The Character @key{ESC} in Constants
3690
3691You can use the sequence @samp{\e} in a string or character constant to
3692stand for the ASCII character @key{ESC}.
3693
3694@node Alignment
3695@section Inquiring on Alignment of Types or Variables
3696@cindex alignment
3697@cindex type alignment
3698@cindex variable alignment
3699
3700The keyword @code{__alignof__} allows you to inquire about how an object
3701is aligned, or the minimum alignment usually required by a type. Its
3702syntax is just like @code{sizeof}.
3703
3704For example, if the target machine requires a @code{double} value to be
3705aligned on an 8-byte boundary, then @code{__alignof__ (double)} is 8.
3706This is true on many RISC machines. On more traditional machine
3707designs, @code{__alignof__ (double)} is 4 or even 2.
3708
3709Some machines never actually require alignment; they allow reference to any
64c18e57 3710data type even at an odd address. For these machines, @code{__alignof__}
2a31c49c
HPN
3711reports the smallest alignment that GCC will give the data type, usually as
3712mandated by the target ABI.
c1f7febf 3713
5372b3fb
NB
3714If the operand of @code{__alignof__} is an lvalue rather than a type,
3715its value is the required alignment for its type, taking into account
3716any minimum alignment specified with GCC's @code{__attribute__}
3717extension (@pxref{Variable Attributes}). For example, after this
3718declaration:
c1f7febf 3719
3ab51846 3720@smallexample
c1f7febf 3721struct foo @{ int x; char y; @} foo1;
3ab51846 3722@end smallexample
c1f7febf
RK
3723
3724@noindent
5372b3fb
NB
3725the value of @code{__alignof__ (foo1.y)} is 1, even though its actual
3726alignment is probably 2 or 4, the same as @code{__alignof__ (int)}.
c1f7febf 3727
9d27bffe
SS
3728It is an error to ask for the alignment of an incomplete type.
3729
c1f7febf
RK
3730@node Variable Attributes
3731@section Specifying Attributes of Variables
3732@cindex attribute of variables
3733@cindex variable attributes
3734
3735The keyword @code{__attribute__} allows you to specify special
3736attributes of variables or structure fields. This keyword is followed
905e8651
RH
3737by an attribute specification inside double parentheses. Some
3738attributes are currently defined generically for variables.
3739Other attributes are defined for variables on particular target
3740systems. Other attributes are available for functions
3741(@pxref{Function Attributes}) and for types (@pxref{Type Attributes}).
3742Other front ends might define more attributes
3743(@pxref{C++ Extensions,,Extensions to the C++ Language}).
c1f7febf
RK
3744
3745You may also specify attributes with @samp{__} preceding and following
3746each keyword. This allows you to use them in header files without
3747being concerned about a possible macro of the same name. For example,
3748you may use @code{__aligned__} instead of @code{aligned}.
3749
2c5e91d2
JM
3750@xref{Attribute Syntax}, for details of the exact syntax for using
3751attributes.
3752
c1f7febf
RK
3753@table @code
3754@cindex @code{aligned} attribute
3755@item aligned (@var{alignment})
3756This attribute specifies a minimum alignment for the variable or
3757structure field, measured in bytes. For example, the declaration:
3758
3759@smallexample
3760int x __attribute__ ((aligned (16))) = 0;
3761@end smallexample
3762
3763@noindent
3764causes the compiler to allocate the global variable @code{x} on a
376516-byte boundary. On a 68040, this could be used in conjunction with
3766an @code{asm} expression to access the @code{move16} instruction which
3767requires 16-byte aligned operands.
3768
3769You can also specify the alignment of structure fields. For example, to
3770create a double-word aligned @code{int} pair, you could write:
3771
3772@smallexample
3773struct foo @{ int x[2] __attribute__ ((aligned (8))); @};
3774@end smallexample
3775
3776@noindent
3777This is an alternative to creating a union with a @code{double} member
3778that forces the union to be double-word aligned.
3779
c1f7febf
RK
3780As in the preceding examples, you can explicitly specify the alignment
3781(in bytes) that you wish the compiler to use for a given variable or
3782structure field. Alternatively, you can leave out the alignment factor
6e4f1168
L
3783and just ask the compiler to align a variable or field to the
3784default alignment for the target architecture you are compiling for.
3785The default alignment is sufficient for all scalar types, but may not be
3786enough for all vector types on a target which supports vector operations.
3787The default alignment is fixed for a particular target ABI.
3788
3789Gcc also provides a target specific macro @code{__BIGGEST_ALIGNMENT__},
3790which is the largest alignment ever used for any data type on the
3791target machine you are compiling for. For example, you could write:
c1f7febf
RK
3792
3793@smallexample
6e4f1168 3794short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
c1f7febf
RK
3795@end smallexample
3796
6e4f1168
L
3797The compiler automatically sets the alignment for the declared
3798variable or field to @code{__BIGGEST_ALIGNMENT__}. Doing this can
3799often make copy operations more efficient, because the compiler can
3800use whatever instructions copy the biggest chunks of memory when
3801performing copies to or from the variables or fields that you have
3802aligned this way. Note that the value of @code{__BIGGEST_ALIGNMENT__}
3803may change depending on command line options.
c1f7febf 3804
e9f9692b
MW
3805When used on a struct, or struct member, the @code{aligned} attribute can
3806only increase the alignment; in order to decrease it, the @code{packed}
3807attribute must be specified as well. When used as part of a typedef, the
3808@code{aligned} attribute can both increase and decrease alignment, and
3809specifying the @code{packed} attribute will generate a warning.
c1f7febf
RK
3810
3811Note that the effectiveness of @code{aligned} attributes may be limited
3812by inherent limitations in your linker. On many systems, the linker is
3813only able to arrange for variables to be aligned up to a certain maximum
3814alignment. (For some linkers, the maximum supported alignment may
3815be very very small.) If your linker is only able to align variables
3816up to a maximum of 8 byte alignment, then specifying @code{aligned(16)}
3817in an @code{__attribute__} will still only provide you with 8 byte
3818alignment. See your linker documentation for further information.
3819
837edd5f
GK
3820The @code{aligned} attribute can also be used for functions
3821(@pxref{Function Attributes}.)
3822
0bfa5f65
RH
3823@item cleanup (@var{cleanup_function})
3824@cindex @code{cleanup} attribute
3825The @code{cleanup} attribute runs a function when the variable goes
3826out of scope. This attribute can only be applied to auto function
3827scope variables; it may not be applied to parameters or variables
3828with static storage duration. The function must take one parameter,
3829a pointer to a type compatible with the variable. The return value
3830of the function (if any) is ignored.
3831
3832If @option{-fexceptions} is enabled, then @var{cleanup_function}
3833will be run during the stack unwinding that happens during the
3834processing of the exception. Note that the @code{cleanup} attribute
3835does not allow the exception to be caught, only to perform an action.
3836It is undefined what happens if @var{cleanup_function} does not
3837return normally.
3838
905e8651
RH
3839@item common
3840@itemx nocommon
3841@cindex @code{common} attribute
3842@cindex @code{nocommon} attribute
3843@opindex fcommon
3844@opindex fno-common
3845The @code{common} attribute requests GCC to place a variable in
3846``common'' storage. The @code{nocommon} attribute requests the
78466c0e 3847opposite---to allocate space for it directly.
905e8651 3848
daf2f129 3849These attributes override the default chosen by the
905e8651
RH
3850@option{-fno-common} and @option{-fcommon} flags respectively.
3851
3852@item deprecated
9b86d6bb 3853@itemx deprecated (@var{msg})
905e8651
RH
3854@cindex @code{deprecated} attribute
3855The @code{deprecated} attribute results in a warning if the variable
3856is used anywhere in the source file. This is useful when identifying
3857variables that are expected to be removed in a future version of a
3858program. The warning also includes the location of the declaration
3859of the deprecated variable, to enable users to easily find further
3860information about why the variable is deprecated, or what they should
64c18e57 3861do instead. Note that the warning only occurs for uses:
905e8651
RH
3862
3863@smallexample
3864extern int old_var __attribute__ ((deprecated));
3865extern int old_var;
3866int new_fn () @{ return old_var; @}
3867@end smallexample
3868
9b86d6bb
L
3869results in a warning on line 3 but not line 2. The optional msg
3870argument, which must be a string, will be printed in the warning if
3871present.
905e8651
RH
3872
3873The @code{deprecated} attribute can also be used for functions and
3874types (@pxref{Function Attributes}, @pxref{Type Attributes}.)
3875
c1f7febf
RK
3876@item mode (@var{mode})
3877@cindex @code{mode} attribute
3878This attribute specifies the data type for the declaration---whichever
3879type corresponds to the mode @var{mode}. This in effect lets you
3880request an integer or floating point type according to its width.
3881
3882You may also specify a mode of @samp{byte} or @samp{__byte__} to
3883indicate the mode corresponding to a one-byte integer, @samp{word} or
3884@samp{__word__} for the mode of a one-word integer, and @samp{pointer}
3885or @samp{__pointer__} for the mode used to represent pointers.
3886
c1f7febf
RK
3887@item packed
3888@cindex @code{packed} attribute
3889The @code{packed} attribute specifies that a variable or structure field
3890should have the smallest possible alignment---one byte for a variable,
3891and one bit for a field, unless you specify a larger value with the
3892@code{aligned} attribute.
3893
3894Here is a structure in which the field @code{x} is packed, so that it
3895immediately follows @code{a}:
3896
3ab51846 3897@smallexample
c1f7febf
RK
3898struct foo
3899@{
3900 char a;
3901 int x[2] __attribute__ ((packed));
3902@};
3ab51846 3903@end smallexample
c1f7febf 3904
2cd36c22
AN
3905@emph{Note:} The 4.1, 4.2 and 4.3 series of GCC ignore the
3906@code{packed} attribute on bit-fields of type @code{char}. This has
3907been fixed in GCC 4.4 but the change can lead to differences in the
048fd785 3908structure layout. See the documentation of
2cd36c22
AN
3909@option{-Wpacked-bitfield-compat} for more information.
3910
84330467 3911@item section ("@var{section-name}")
c1f7febf
RK
3912@cindex @code{section} variable attribute
3913Normally, the compiler places the objects it generates in sections like
3914@code{data} and @code{bss}. Sometimes, however, you need additional sections,
3915or you need certain particular variables to appear in special sections,
3916for example to map to special hardware. The @code{section}
3917attribute specifies that a variable (or function) lives in a particular
3918section. For example, this small program uses several specific section names:
3919
3920@smallexample
3921struct duart a __attribute__ ((section ("DUART_A"))) = @{ 0 @};
3922struct duart b __attribute__ ((section ("DUART_B"))) = @{ 0 @};
3923char stack[10000] __attribute__ ((section ("STACK"))) = @{ 0 @};
8b9d598f 3924int init_data __attribute__ ((section ("INITDATA")));
c1f7febf
RK
3925
3926main()
3927@{
12bcfaa1 3928 /* @r{Initialize stack pointer} */
c1f7febf
RK
3929 init_sp (stack + sizeof (stack));
3930
12bcfaa1 3931 /* @r{Initialize initialized data} */
c1f7febf
RK
3932 memcpy (&init_data, &data, &edata - &data);
3933
12bcfaa1 3934 /* @r{Turn on the serial ports} */
c1f7febf
RK
3935 init_duart (&a);
3936 init_duart (&b);
3937@}
3938@end smallexample
3939
3940@noindent
8b9d598f
SE
3941Use the @code{section} attribute with
3942@emph{global} variables and not @emph{local} variables,
3943as shown in the example.
c1f7febf 3944
8b9d598f
SE
3945You may use the @code{section} attribute with initialized or
3946uninitialized global variables but the linker requires
c1f7febf
RK
3947each object be defined once, with the exception that uninitialized
3948variables tentatively go in the @code{common} (or @code{bss}) section
8b9d598f
SE
3949and can be multiply ``defined''. Using the @code{section} attribute
3950will change what section the variable goes into and may cause the
3951linker to issue an error if an uninitialized variable has multiple
3952definitions. You can force a variable to be initialized with the
3953@option{-fno-common} flag or the @code{nocommon} attribute.
c1f7febf
RK
3954
3955Some file formats do not support arbitrary sections so the @code{section}
3956attribute is not available on all platforms.
3957If you need to map the entire contents of a module to a particular
3958section, consider using the facilities of the linker instead.
3959
593d3a34
MK
3960@item shared
3961@cindex @code{shared} variable attribute
95fef11f 3962On Microsoft Windows, in addition to putting variable definitions in a named
02f52e19 3963section, the section can also be shared among all running copies of an
161d7b59 3964executable or DLL@. For example, this small program defines shared data
84330467 3965by putting it in a named section @code{shared} and marking the section
593d3a34
MK
3966shareable:
3967
3968@smallexample
3969int foo __attribute__((section ("shared"), shared)) = 0;
3970
3971int
3972main()
3973@{
12bcfaa1
JM
3974 /* @r{Read and write foo. All running
3975 copies see the same value.} */
593d3a34
MK
3976 return 0;
3977@}
3978@end smallexample
3979
3980@noindent
3981You may only use the @code{shared} attribute along with @code{section}
02f52e19 3982attribute with a fully initialized global definition because of the way
593d3a34
MK
3983linkers work. See @code{section} attribute for more information.
3984
95fef11f 3985The @code{shared} attribute is only available on Microsoft Windows@.
593d3a34 3986
905e8651
RH
3987@item tls_model ("@var{tls_model}")
3988@cindex @code{tls_model} attribute
3989The @code{tls_model} attribute sets thread-local storage model
3990(@pxref{Thread-Local}) of a particular @code{__thread} variable,
4ec7afd7 3991overriding @option{-ftls-model=} command line switch on a per-variable
905e8651
RH
3992basis.
3993The @var{tls_model} argument should be one of @code{global-dynamic},
3994@code{local-dynamic}, @code{initial-exec} or @code{local-exec}.
3995
3996Not all targets support this attribute.
3997
c1f7febf
RK
3998@item unused
3999This attribute, attached to a variable, means that the variable is meant
f0523f02 4000to be possibly unused. GCC will not produce a warning for this
c1f7febf
RK
4001variable.
4002
5f79d643
RM
4003@item used
4004This attribute, attached to a variable, means that the variable must be
4005emitted even if it appears that the variable is not referenced.
4006
1b9191d2
AH
4007@item vector_size (@var{bytes})
4008This attribute specifies the vector size for the variable, measured in
4009bytes. For example, the declaration:
4010
4011@smallexample
4012int foo __attribute__ ((vector_size (16)));
4013@end smallexample
4014
4015@noindent
4016causes the compiler to set the mode for @code{foo}, to be 16 bytes,
4017divided into @code{int} sized units. Assuming a 32-bit int (a vector of
40184 units of 4 bytes), the corresponding mode of @code{foo} will be V4SI@.
4019
4020This attribute is only applicable to integral and float scalars,
4021although arrays, pointers, and function return values are allowed in
4022conjunction with this construct.
4023
4024Aggregates with this attribute are invalid, even if they are of the same
4025size as a corresponding scalar. For example, the declaration:
4026
4027@smallexample
ad706f54 4028struct S @{ int a; @};
1b9191d2
AH
4029struct S __attribute__ ((vector_size (16))) foo;
4030@end smallexample
4031
4032@noindent
4033is invalid even if the size of the structure is the same as the size of
4034the @code{int}.
4035
a20f6f00
DS
4036@item selectany
4037The @code{selectany} attribute causes an initialized global variable to
4038have link-once semantics. When multiple definitions of the variable are
4039encountered by the linker, the first is selected and the remainder are
4040discarded. Following usage by the Microsoft compiler, the linker is told
4041@emph{not} to warn about size or content differences of the multiple
4042definitions.
4043
4044Although the primary usage of this attribute is for POD types, the
4045attribute can also be applied to global C++ objects that are initialized
4046by a constructor. In this case, the static initialization and destruction
4047code for the object is emitted in each translation defining the object,
4048but the calls to the constructor and destructor are protected by a
0ac11108 4049link-once guard variable.
a20f6f00
DS
4050
4051The @code{selectany} attribute is only available on Microsoft Windows
4052targets. You can use @code{__declspec (selectany)} as a synonym for
4053@code{__attribute__ ((selectany))} for compatibility with other
4054compilers.
4055
c1f7febf 4056@item weak
38bb2b65 4057The @code{weak} attribute is described in @ref{Function Attributes}.
6b6cb52e
DS
4058
4059@item dllimport
38bb2b65 4060The @code{dllimport} attribute is described in @ref{Function Attributes}.
6b6cb52e 4061
9baf8aea 4062@item dllexport
38bb2b65 4063The @code{dllexport} attribute is described in @ref{Function Attributes}.
6b6cb52e 4064
905e8651
RH
4065@end table
4066
4af797b5
JZ
4067@subsection Blackfin Variable Attributes
4068
4069Three attributes are currently defined for the Blackfin.
4070
4071@table @code
4072@item l1_data
4073@item l1_data_A
4074@item l1_data_B
4075@cindex @code{l1_data} variable attribute
4076@cindex @code{l1_data_A} variable attribute
4077@cindex @code{l1_data_B} variable attribute
4078Use these attributes on the Blackfin to place the variable into L1 Data SRAM.
4079Variables with @code{l1_data} attribute will be put into the specific section
4080named @code{.l1.data}. Those with @code{l1_data_A} attribute will be put into
4081the specific section named @code{.l1.data.A}. Those with @code{l1_data_B}
4082attribute will be put into the specific section named @code{.l1.data.B}.
4083@end table
4084
905e8651 4085@subsection M32R/D Variable Attributes
845da534 4086
8a36672b 4087One attribute is currently defined for the M32R/D@.
905e8651
RH
4088
4089@table @code
845da534
DE
4090@item model (@var{model-name})
4091@cindex variable addressability on the M32R/D
4092Use this attribute on the M32R/D to set the addressability of an object.
4093The identifier @var{model-name} is one of @code{small}, @code{medium},
4094or @code{large}, representing each of the code models.
4095
4096Small model objects live in the lower 16MB of memory (so that their
4097addresses can be loaded with the @code{ld24} instruction).
4098
02f52e19 4099Medium and large model objects may live anywhere in the 32-bit address space
845da534
DE
4100(the compiler will generate @code{seth/add3} instructions to load their
4101addresses).
905e8651 4102@end table
845da534 4103
1ccbef77 4104@anchor{i386 Variable Attributes}
fe77449a
DR
4105@subsection i386 Variable Attributes
4106
4107Two attributes are currently defined for i386 configurations:
4108@code{ms_struct} and @code{gcc_struct}
4109
905e8651 4110@table @code
fe77449a
DR
4111@item ms_struct
4112@itemx gcc_struct
905e8651
RH
4113@cindex @code{ms_struct} attribute
4114@cindex @code{gcc_struct} attribute
fe77449a
DR
4115
4116If @code{packed} is used on a structure, or if bit-fields are used
4117it may be that the Microsoft ABI packs them differently
4118than GCC would normally pack them. Particularly when moving packed
4119data between functions compiled with GCC and the native Microsoft compiler
4120(either via function call or as data in a file), it may be necessary to access
4121either format.
4122
95fef11f 4123Currently @option{-m[no-]ms-bitfields} is provided for the Microsoft Windows X86
fe77449a 4124compilers to match the native Microsoft compiler.
0ac11108
EC
4125
4126The Microsoft structure layout algorithm is fairly simple with the exception
4127of the bitfield packing:
4128
4129The padding and alignment of members of structures and whether a bit field
4130can straddle a storage-unit boundary
4131
4132@enumerate
4133@item Structure members are stored sequentially in the order in which they are
4134declared: the first member has the lowest memory address and the last member
4135the highest.
4136
4137@item Every data object has an alignment-requirement. The alignment-requirement
4138for all data except structures, unions, and arrays is either the size of the
4139object or the current packing size (specified with either the aligned attribute
4140or the pack pragma), whichever is less. For structures, unions, and arrays,
4141the alignment-requirement is the largest alignment-requirement of its members.
4142Every object is allocated an offset so that:
4143
4144offset % alignment-requirement == 0
4145
4146@item Adjacent bit fields are packed into the same 1-, 2-, or 4-byte allocation
4147unit if the integral types are the same size and if the next bit field fits
4148into the current allocation unit without crossing the boundary imposed by the
4149common alignment requirements of the bit fields.
4150@end enumerate
4151
4152Handling of zero-length bitfields:
4153
4154MSVC interprets zero-length bitfields in the following ways:
4155
4156@enumerate
4157@item If a zero-length bitfield is inserted between two bitfields that would
4158normally be coalesced, the bitfields will not be coalesced.
4159
4160For example:
4161
4162@smallexample
4163struct
4164 @{
4165 unsigned long bf_1 : 12;
4166 unsigned long : 0;
4167 unsigned long bf_2 : 12;
4168 @} t1;
4169@end smallexample
4170
4171The size of @code{t1} would be 8 bytes with the zero-length bitfield. If the
4172zero-length bitfield were removed, @code{t1}'s size would be 4 bytes.
4173
4174@item If a zero-length bitfield is inserted after a bitfield, @code{foo}, and the
4175alignment of the zero-length bitfield is greater than the member that follows it,
4176@code{bar}, @code{bar} will be aligned as the type of the zero-length bitfield.
4177
4178For example:
4179
4180@smallexample
4181struct
4182 @{
4183 char foo : 4;
4184 short : 0;
4185 char bar;
4186 @} t2;
4187
4188struct
4189 @{
4190 char foo : 4;
4191 short : 0;
4192 double bar;
4193 @} t3;
4194@end smallexample
4195
4196For @code{t2}, @code{bar} will be placed at offset 2, rather than offset 1.
4197Accordingly, the size of @code{t2} will be 4. For @code{t3}, the zero-length
4198bitfield will not affect the alignment of @code{bar} or, as a result, the size
4199of the structure.
4200
4201Taking this into account, it is important to note the following:
4202
4203@enumerate
4204@item If a zero-length bitfield follows a normal bitfield, the type of the
4205zero-length bitfield may affect the alignment of the structure as whole. For
4206example, @code{t2} has a size of 4 bytes, since the zero-length bitfield follows a
4207normal bitfield, and is of type short.
4208
4209@item Even if a zero-length bitfield is not followed by a normal bitfield, it may
4210still affect the alignment of the structure:
4211
4212@smallexample
4213struct
4214 @{
4215 char foo : 6;
4216 long : 0;
4217 @} t4;
4218@end smallexample
4219
4220Here, @code{t4} will take up 4 bytes.
4221@end enumerate
4222
4223@item Zero-length bitfields following non-bitfield members are ignored:
4224
4225@smallexample
4226struct
4227 @{
4228 char foo;
4229 long : 0;
4230 char bar;
4231 @} t5;
4232@end smallexample
4233
4234Here, @code{t5} will take up 2 bytes.
4235@end enumerate
c1f7febf
RK
4236@end table
4237
1ccbef77
EC
4238@subsection PowerPC Variable Attributes
4239
63d0dca4
DE
4240Three attributes currently are defined for PowerPC configurations:
4241@code{altivec}, @code{ms_struct} and @code{gcc_struct}.
1ccbef77 4242
63d0dca4 4243For full documentation of the struct attributes please see the
38bb2b65 4244documentation in @ref{i386 Variable Attributes}.
63d0dca4
DE
4245
4246For documentation of @code{altivec} attribute please see the
38bb2b65 4247documentation in @ref{PowerPC Type Attributes}.
1ccbef77 4248
85d9c13c
TS
4249@subsection SPU Variable Attributes
4250
4251The SPU supports the @code{spu_vector} attribute for variables. For
38bb2b65
SL
4252documentation of this attribute please see the documentation in
4253@ref{SPU Type Attributes}.
85d9c13c 4254
54e9a19d
DD
4255@subsection Xstormy16 Variable Attributes
4256
4257One attribute is currently defined for xstormy16 configurations:
38bb2b65 4258@code{below100}.
54e9a19d
DD
4259
4260@table @code
4261@item below100
4262@cindex @code{below100} attribute
4263
4264If a variable has the @code{below100} attribute (@code{BELOW100} is
4265allowed also), GCC will place the variable in the first 0x100 bytes of
4266memory and use special opcodes to access it. Such variables will be
4267placed in either the @code{.bss_below100} section or the
4268@code{.data_below100} section.
4269
4270@end table
4271
79532d34
EW
4272@subsection AVR Variable Attributes
4273
4274@table @code
4275@item progmem
4276@cindex @code{progmem} variable attribute
4277The @code{progmem} attribute is used on the AVR to place data in the Program
4278Memory address space. The AVR is a Harvard Architecture processor and data
4279normally resides in the Data Memory address space.
4280@end table
4281
c1f7febf
RK
4282@node Type Attributes
4283@section Specifying Attributes of Types
4284@cindex attribute of types
4285@cindex type attributes
4286
4287The keyword @code{__attribute__} allows you to specify special
b9e75696
JM
4288attributes of @code{struct} and @code{union} types when you define
4289such types. This keyword is followed by an attribute specification
4290inside double parentheses. Seven attributes are currently defined for
4291types: @code{aligned}, @code{packed}, @code{transparent_union},
4292@code{unused}, @code{deprecated}, @code{visibility}, and
4293@code{may_alias}. Other attributes are defined for functions
4294(@pxref{Function Attributes}) and for variables (@pxref{Variable
4295Attributes}).
c1f7febf
RK
4296
4297You may also specify any one of these attributes with @samp{__}
4298preceding and following its keyword. This allows you to use these
4299attributes in header files without being concerned about a possible
4300macro of the same name. For example, you may use @code{__aligned__}
4301instead of @code{aligned}.
4302
4009f2e7
JM
4303You may specify type attributes in an enum, struct or union type
4304declaration or definition, or for other types in a @code{typedef}
4305declaration.
c1f7febf 4306
b9e75696
JM
4307For an enum, struct or union type, you may specify attributes either
4308between the enum, struct or union tag and the name of the type, or
4309just past the closing curly brace of the @emph{definition}. The
4310former syntax is preferred.
4051959b 4311
2c5e91d2
JM
4312@xref{Attribute Syntax}, for details of the exact syntax for using
4313attributes.
4314
c1f7febf
RK
4315@table @code
4316@cindex @code{aligned} attribute
4317@item aligned (@var{alignment})
4318This attribute specifies a minimum alignment (in bytes) for variables
4319of the specified type. For example, the declarations:
4320
4321@smallexample
f69eecfb
JL
4322struct S @{ short f[3]; @} __attribute__ ((aligned (8)));
4323typedef int more_aligned_int __attribute__ ((aligned (8)));
c1f7febf
RK
4324@end smallexample
4325
4326@noindent
d863830b 4327force the compiler to insure (as far as it can) that each variable whose
c1f7febf 4328type is @code{struct S} or @code{more_aligned_int} will be allocated and
981f6289 4329aligned @emph{at least} on a 8-byte boundary. On a SPARC, having all
c1f7febf
RK
4330variables of type @code{struct S} aligned to 8-byte boundaries allows
4331the compiler to use the @code{ldd} and @code{std} (doubleword load and
4332store) instructions when copying one variable of type @code{struct S} to
4333another, thus improving run-time efficiency.
4334
4335Note that the alignment of any given @code{struct} or @code{union} type
5490d604 4336is required by the ISO C standard to be at least a perfect multiple of
c1f7febf
RK
4337the lowest common multiple of the alignments of all of the members of
4338the @code{struct} or @code{union} in question. This means that you @emph{can}
4339effectively adjust the alignment of a @code{struct} or @code{union}
4340type by attaching an @code{aligned} attribute to any one of the members
4341of such a type, but the notation illustrated in the example above is a
4342more obvious, intuitive, and readable way to request the compiler to
4343adjust the alignment of an entire @code{struct} or @code{union} type.
4344
4345As in the preceding example, you can explicitly specify the alignment
4346(in bytes) that you wish the compiler to use for a given @code{struct}
4347or @code{union} type. Alternatively, you can leave out the alignment factor
4348and just ask the compiler to align a type to the maximum
4349useful alignment for the target machine you are compiling for. For
4350example, you could write:
4351
4352@smallexample
4353struct S @{ short f[3]; @} __attribute__ ((aligned));
4354@end smallexample
4355
4356Whenever you leave out the alignment factor in an @code{aligned}
4357attribute specification, the compiler automatically sets the alignment
4358for the type to the largest alignment which is ever used for any data
4359type on the target machine you are compiling for. Doing this can often
4360make copy operations more efficient, because the compiler can use
4361whatever instructions copy the biggest chunks of memory when performing
4362copies to or from the variables which have types that you have aligned
4363this way.
4364
4365In the example above, if the size of each @code{short} is 2 bytes, then
4366the size of the entire @code{struct S} type is 6 bytes. The smallest
4367power of two which is greater than or equal to that is 8, so the
4368compiler sets the alignment for the entire @code{struct S} type to 8
4369bytes.
4370
4371Note that although you can ask the compiler to select a time-efficient
4372alignment for a given type and then declare only individual stand-alone
4373objects of that type, the compiler's ability to select a time-efficient
4374alignment is primarily useful only when you plan to create arrays of
4375variables having the relevant (efficiently aligned) type. If you
4376declare or use arrays of variables of an efficiently-aligned type, then
4377it is likely that your program will also be doing pointer arithmetic (or
4378subscripting, which amounts to the same thing) on pointers to the
4379relevant type, and the code that the compiler generates for these
4380pointer arithmetic operations will often be more efficient for
4381efficiently-aligned types than for other types.
4382
4383The @code{aligned} attribute can only increase the alignment; but you
4384can decrease it by specifying @code{packed} as well. See below.
4385
4386Note that the effectiveness of @code{aligned} attributes may be limited
4387by inherent limitations in your linker. On many systems, the linker is
4388only able to arrange for variables to be aligned up to a certain maximum
4389alignment. (For some linkers, the maximum supported alignment may
4390be very very small.) If your linker is only able to align variables
4391up to a maximum of 8 byte alignment, then specifying @code{aligned(16)}
4392in an @code{__attribute__} will still only provide you with 8 byte
4393alignment. See your linker documentation for further information.
4394
4395@item packed
a5bcc582 4396This attribute, attached to @code{struct} or @code{union} type
d1a701eb
MM
4397definition, specifies that each member (other than zero-width bitfields)
4398of the structure or union is placed to minimize the memory required. When
4399attached to an @code{enum} definition, it indicates that the smallest
4400integral type should be used.
c1f7febf 4401
84330467 4402@opindex fshort-enums
c1f7febf
RK
4403Specifying this attribute for @code{struct} and @code{union} types is
4404equivalent to specifying the @code{packed} attribute on each of the
84330467 4405structure or union members. Specifying the @option{-fshort-enums}
c1f7febf
RK
4406flag on the line is equivalent to specifying the @code{packed}
4407attribute on all @code{enum} definitions.
4408
a5bcc582
NS
4409In the following example @code{struct my_packed_struct}'s members are
4410packed closely together, but the internal layout of its @code{s} member
78466c0e 4411is not packed---to do that, @code{struct my_unpacked_struct} would need to
a5bcc582
NS
4412be packed too.
4413
4414@smallexample
4415struct my_unpacked_struct
4416 @{
4417 char c;
4418 int i;
4419 @};
4420
75b66a16 4421struct __attribute__ ((__packed__)) my_packed_struct
a5bcc582
NS
4422 @{
4423 char c;
4424 int i;
4425 struct my_unpacked_struct s;
4426 @};
4427@end smallexample
4428
e4ae5e77 4429You may only specify this attribute on the definition of an @code{enum},
a5bcc582
NS
4430@code{struct} or @code{union}, not on a @code{typedef} which does not
4431also define the enumerated type, structure or union.
c1f7febf
RK
4432
4433@item transparent_union
4434This attribute, attached to a @code{union} type definition, indicates
4435that any function parameter having that union type causes calls to that
4436function to be treated in a special way.
4437
4438First, the argument corresponding to a transparent union type can be of
4439any type in the union; no cast is required. Also, if the union contains
4440a pointer type, the corresponding argument can be a null pointer
4441constant or a void pointer expression; and if the union contains a void
4442pointer type, the corresponding argument can be any pointer expression.
4443If the union member type is a pointer, qualifiers like @code{const} on
4444the referenced type must be respected, just as with normal pointer
4445conversions.
4446
4447Second, the argument is passed to the function using the calling
64c18e57 4448conventions of the first member of the transparent union, not the calling
c1f7febf
RK
4449conventions of the union itself. All members of the union must have the
4450same machine representation; this is necessary for this argument passing
4451to work properly.
4452
4453Transparent unions are designed for library functions that have multiple
4454interfaces for compatibility reasons. For example, suppose the
4455@code{wait} function must accept either a value of type @code{int *} to
4456comply with Posix, or a value of type @code{union wait *} to comply with
4457the 4.1BSD interface. If @code{wait}'s parameter were @code{void *},
4458@code{wait} would accept both kinds of arguments, but it would also
4459accept any other pointer type and this would make argument type checking
4460less useful. Instead, @code{<sys/wait.h>} might define the interface
4461as follows:
4462
4463@smallexample
4009f2e7 4464typedef union __attribute__ ((__transparent_union__))
c1f7febf
RK
4465 @{
4466 int *__ip;
4467 union wait *__up;
4009f2e7 4468 @} wait_status_ptr_t;
c1f7febf
RK
4469
4470pid_t wait (wait_status_ptr_t);
4471@end smallexample
4472
4473This interface allows either @code{int *} or @code{union wait *}
4474arguments to be passed, using the @code{int *} calling convention.
4475The program can call @code{wait} with arguments of either type:
4476
3ab51846 4477@smallexample
c1f7febf
RK
4478int w1 () @{ int w; return wait (&w); @}
4479int w2 () @{ union wait w; return wait (&w); @}
3ab51846 4480@end smallexample
c1f7febf
RK
4481
4482With this interface, @code{wait}'s implementation might look like this:
4483
3ab51846 4484@smallexample
c1f7febf
RK
4485pid_t wait (wait_status_ptr_t p)
4486@{
4487 return waitpid (-1, p.__ip, 0);
4488@}
3ab51846 4489@end smallexample
d863830b
JL
4490
4491@item unused
4492When attached to a type (including a @code{union} or a @code{struct}),
4493this attribute means that variables of that type are meant to appear
f0523f02 4494possibly unused. GCC will not produce a warning for any variables of
d863830b
JL
4495that type, even if the variable appears to do nothing. This is often
4496the case with lock or thread classes, which are usually defined and then
4497not referenced, but contain constructors and destructors that have
956d6950 4498nontrivial bookkeeping functions.
d863830b 4499
e23bd218 4500@item deprecated
9b86d6bb 4501@itemx deprecated (@var{msg})
e23bd218
IR
4502The @code{deprecated} attribute results in a warning if the type
4503is used anywhere in the source file. This is useful when identifying
4504types that are expected to be removed in a future version of a program.
4505If possible, the warning also includes the location of the declaration
4506of the deprecated type, to enable users to easily find further
4507information about why the type is deprecated, or what they should do
4508instead. Note that the warnings only occur for uses and then only
adc9fe67 4509if the type is being applied to an identifier that itself is not being
e23bd218
IR
4510declared as deprecated.
4511
4512@smallexample
4513typedef int T1 __attribute__ ((deprecated));
4514T1 x;
4515typedef T1 T2;
4516T2 y;
4517typedef T1 T3 __attribute__ ((deprecated));
4518T3 z __attribute__ ((deprecated));
4519@end smallexample
4520
4521results in a warning on line 2 and 3 but not lines 4, 5, or 6. No
4522warning is issued for line 4 because T2 is not explicitly
4523deprecated. Line 5 has no warning because T3 is explicitly
9b86d6bb
L
4524deprecated. Similarly for line 6. The optional msg
4525argument, which must be a string, will be printed in the warning if
4526present.
e23bd218
IR
4527
4528The @code{deprecated} attribute can also be used for functions and
4529variables (@pxref{Function Attributes}, @pxref{Variable Attributes}.)
4530
d18b1ed8 4531@item may_alias
ac7ee6ad
RG
4532Accesses through pointers to types with this attribute are not subject
4533to type-based alias analysis, but are instead assumed to be able to alias
4534any other type of objects. In the context of 6.5/7 an lvalue expression
4535dereferencing such a pointer is treated like having a character type.
4536See @option{-fstrict-aliasing} for more information on aliasing issues.
4537This extension exists to support some vector APIs, in which pointers to
4538one vector type are permitted to alias pointers to a different vector type.
4539
4540Note that an object of a type with this attribute does not have any
4541special semantics.
d18b1ed8
OS
4542
4543Example of use:
4544
478c9e72 4545@smallexample
d18b1ed8
OS
4546typedef short __attribute__((__may_alias__)) short_a;
4547
4548int
4549main (void)
4550@{
4551 int a = 0x12345678;
4552 short_a *b = (short_a *) &a;
4553
4554 b[1] = 0;
4555
4556 if (a == 0x12345678)
4557 abort();
4558
4559 exit(0);
4560@}
478c9e72 4561@end smallexample
d18b1ed8
OS
4562
4563If you replaced @code{short_a} with @code{short} in the variable
4564declaration, the above program would abort when compiled with
4565@option{-fstrict-aliasing}, which is on by default at @option{-O2} or
4566above in recent GCC versions.
fe77449a 4567
b9e75696 4568@item visibility
b9e75696
JM
4569In C++, attribute visibility (@pxref{Function Attributes}) can also be
4570applied to class, struct, union and enum types. Unlike other type
4571attributes, the attribute must appear between the initial keyword and
4572the name of the type; it cannot appear after the body of the type.
4573
b70f0f48
JM
4574Note that the type visibility is applied to vague linkage entities
4575associated with the class (vtable, typeinfo node, etc.). In
4576particular, if a class is thrown as an exception in one shared object
4577and caught in another, the class must have default visibility.
4578Otherwise the two shared objects will be unable to use the same
4579typeinfo node and exception handling will break.
4580
38bb2b65
SL
4581@end table
4582
04fb56d5
MM
4583@subsection ARM Type Attributes
4584
4585On those ARM targets that support @code{dllimport} (such as Symbian
f0eb93a8 4586OS), you can use the @code{notshared} attribute to indicate that the
04fb56d5 4587virtual table and other similar data for a class should not be
8a36672b 4588exported from a DLL@. For example:
04fb56d5
MM
4589
4590@smallexample
4591class __declspec(notshared) C @{
4592public:
f0eb93a8 4593 __declspec(dllimport) C();
04fb56d5
MM
4594 virtual void f();
4595@}
4596
4597__declspec(dllexport)
4598C::C() @{@}
4599@end smallexample
4600
4601In this code, @code{C::C} is exported from the current DLL, but the
4602virtual table for @code{C} is not exported. (You can use
4603@code{__attribute__} instead of @code{__declspec} if you prefer, but
4604most Symbian OS code uses @code{__declspec}.)
4605
63d0dca4 4606@anchor{i386 Type Attributes}
fe77449a
DR
4607@subsection i386 Type Attributes
4608
4609Two attributes are currently defined for i386 configurations:
38bb2b65
SL
4610@code{ms_struct} and @code{gcc_struct}.
4611
4612@table @code
fe77449a
DR
4613
4614@item ms_struct
4615@itemx gcc_struct
4616@cindex @code{ms_struct}
4617@cindex @code{gcc_struct}
4618
4619If @code{packed} is used on a structure, or if bit-fields are used
4620it may be that the Microsoft ABI packs them differently
4621than GCC would normally pack them. Particularly when moving packed
4622data between functions compiled with GCC and the native Microsoft compiler
4623(either via function call or as data in a file), it may be necessary to access
4624either format.
4625
95fef11f 4626Currently @option{-m[no-]ms-bitfields} is provided for the Microsoft Windows X86
fe77449a 4627compilers to match the native Microsoft compiler.
c1f7febf
RK
4628@end table
4629
4630To specify multiple attributes, separate them by commas within the
4631double parentheses: for example, @samp{__attribute__ ((aligned (16),
4632packed))}.
4633
63d0dca4
DE
4634@anchor{PowerPC Type Attributes}
4635@subsection PowerPC Type Attributes
4636
4637Three attributes currently are defined for PowerPC configurations:
4638@code{altivec}, @code{ms_struct} and @code{gcc_struct}.
4639
38bb2b65
SL
4640For full documentation of the @code{ms_struct} and @code{gcc_struct}
4641attributes please see the documentation in @ref{i386 Type Attributes}.
63d0dca4
DE
4642
4643The @code{altivec} attribute allows one to declare AltiVec vector data
4644types supported by the AltiVec Programming Interface Manual. The
4645attribute requires an argument to specify one of three vector types:
4646@code{vector__}, @code{pixel__} (always followed by unsigned short),
4647and @code{bool__} (always followed by unsigned).
4648
4649@smallexample
4650__attribute__((altivec(vector__)))
4651__attribute__((altivec(pixel__))) unsigned short
4652__attribute__((altivec(bool__))) unsigned
4653@end smallexample
4654
4655These attributes mainly are intended to support the @code{__vector},
4656@code{__pixel}, and @code{__bool} AltiVec keywords.
4657
85d9c13c
TS
4658@anchor{SPU Type Attributes}
4659@subsection SPU Type Attributes
4660
4661The SPU supports the @code{spu_vector} attribute for types. This attribute
4662allows one to declare vector data types supported by the Sony/Toshiba/IBM SPU
4663Language Extensions Specification. It is intended to support the
4664@code{__vector} keyword.
4665
4666
c1f7febf
RK
4667@node Inline
4668@section An Inline Function is As Fast As a Macro
4669@cindex inline functions
4670@cindex integrating function code
4671@cindex open coding
4672@cindex macros, inline alternative
4673
0a052b16
GK
4674By declaring a function inline, you can direct GCC to make
4675calls to that function faster. One way GCC can achieve this is to
c1f7febf
RK
4676integrate that function's code into the code for its callers. This
4677makes execution faster by eliminating the function-call overhead; in
0a052b16
GK
4678addition, if any of the actual argument values are constant, their
4679known values may permit simplifications at compile time so that not
4680all of the inline function's code needs to be included. The effect on
4681code size is less predictable; object code may be larger or smaller
4682with function inlining, depending on the particular case. You can
4683also direct GCC to try to integrate all ``simple enough'' functions
4684into their callers with the option @option{-finline-functions}.
4685
4686GCC implements three different semantics of declaring a function
da1c7394
ILT
4687inline. One is available with @option{-std=gnu89} or
4688@option{-fgnu89-inline} or when @code{gnu_inline} attribute is present
4689on all inline declarations, another when @option{-std=c99} or
4690@option{-std=gnu99} (without @option{-fgnu89-inline}), and the third
4691is used when compiling C++.
4b404517 4692
c1f7febf
RK
4693To declare a function inline, use the @code{inline} keyword in its
4694declaration, like this:
4695
3ab51846 4696@smallexample
0a052b16 4697static inline int
c1f7febf
RK
4698inc (int *a)
4699@{
4700 (*a)++;
4701@}
3ab51846 4702@end smallexample
c1f7febf 4703
0a052b16
GK
4704If you are writing a header file to be included in ISO C89 programs, write
4705@code{__inline__} instead of @code{inline}. @xref{Alternate Keywords}.
247b14bd 4706
0a052b16
GK
4707The three types of inlining behave similarly in two important cases:
4708when the @code{inline} keyword is used on a @code{static} function,
4709like the example above, and when a function is first declared without
4710using the @code{inline} keyword and then is defined with
4711@code{inline}, like this:
c1f7febf 4712
0a052b16
GK
4713@smallexample
4714extern int inc (int *a);
4715inline int
4716inc (int *a)
4717@{
4718 (*a)++;
4719@}
4720@end smallexample
c1f7febf 4721
0a052b16
GK
4722In both of these common cases, the program behaves the same as if you
4723had not used the @code{inline} keyword, except for its speed.
c1f7febf
RK
4724
4725@cindex inline functions, omission of
84330467 4726@opindex fkeep-inline-functions
c1f7febf
RK
4727When a function is both inline and @code{static}, if all calls to the
4728function are integrated into the caller, and the function's address is
4729never used, then the function's own assembler code is never referenced.
f0523f02 4730In this case, GCC does not actually output assembler code for the
84330467 4731function, unless you specify the option @option{-fkeep-inline-functions}.
c1f7febf
RK
4732Some calls cannot be integrated for various reasons (in particular,
4733calls that precede the function's definition cannot be integrated, and
4734neither can recursive calls within the definition). If there is a
4735nonintegrated call, then the function is compiled to assembler code as
4736usual. The function must also be compiled as usual if the program
4737refers to its address, because that can't be inlined.
4738
0a052b16
GK
4739@opindex Winline
4740Note that certain usages in a function definition can make it unsuitable
4741for inline substitution. Among these usages are: use of varargs, use of
4742alloca, use of variable sized data types (@pxref{Variable Length}),
4743use of computed goto (@pxref{Labels as Values}), use of nonlocal goto,
4744and nested functions (@pxref{Nested Functions}). Using @option{-Winline}
4745will warn when a function marked @code{inline} could not be substituted,
4746and will give the reason for the failure.
4747
4748@cindex automatic @code{inline} for C++ member fns
4749@cindex @code{inline} automatic for C++ member fns
4750@cindex member fns, automatically @code{inline}
4751@cindex C++ member fns, automatically @code{inline}
4752@opindex fno-default-inline
4753As required by ISO C++, GCC considers member functions defined within
4754the body of a class to be marked inline even if they are
4755not explicitly declared with the @code{inline} keyword. You can
4756override this with @option{-fno-default-inline}; @pxref{C++ Dialect
4757Options,,Options Controlling C++ Dialect}.
4758
4759GCC does not inline any functions when not optimizing unless you specify
4760the @samp{always_inline} attribute for the function, like this:
4761
4762@smallexample
4763/* @r{Prototype.} */
4764inline void foo (const char) __attribute__((always_inline));
4765@end smallexample
4766
4767The remainder of this section is specific to GNU C89 inlining.
4768
c1f7febf
RK
4769@cindex non-static inline function
4770When an inline function is not @code{static}, then the compiler must assume
4771that there may be calls from other source files; since a global symbol can
4772be defined only once in any program, the function must not be defined in
4773the other source files, so the calls therein cannot be integrated.
4774Therefore, a non-@code{static} inline function is always compiled on its
4775own in the usual fashion.
4776
4777If you specify both @code{inline} and @code{extern} in the function
4778definition, then the definition is used only for inlining. In no case
4779is the function compiled on its own, not even if you refer to its
4780address explicitly. Such an address becomes an external reference, as
4781if you had only declared the function, and had not defined it.
4782
4783This combination of @code{inline} and @code{extern} has almost the
4784effect of a macro. The way to use it is to put a function definition in
4785a header file with these keywords, and put another copy of the
4786definition (lacking @code{inline} and @code{extern}) in a library file.
4787The definition in the header file will cause most calls to the function
4788to be inlined. If any uses of the function remain, they will refer to
4789the single copy in the library.
4790
c1f7febf
RK
4791@node Extended Asm
4792@section Assembler Instructions with C Expression Operands
4793@cindex extended @code{asm}
4794@cindex @code{asm} expressions
4795@cindex assembler instructions
4796@cindex registers
4797
c85f7c16
JL
4798In an assembler instruction using @code{asm}, you can specify the
4799operands of the instruction using C expressions. This means you need not
4800guess which registers or memory locations will contain the data you want
c1f7febf
RK
4801to use.
4802
c85f7c16
JL
4803You must specify an assembler instruction template much like what
4804appears in a machine description, plus an operand constraint string for
4805each operand.
c1f7febf
RK
4806
4807For example, here is how to use the 68881's @code{fsinx} instruction:
4808
3ab51846 4809@smallexample
c1f7febf 4810asm ("fsinx %1,%0" : "=f" (result) : "f" (angle));
3ab51846 4811@end smallexample
c1f7febf
RK
4812
4813@noindent
4814Here @code{angle} is the C expression for the input operand while
4815@code{result} is that of the output operand. Each has @samp{"f"} as its
c85f7c16
JL
4816operand constraint, saying that a floating point register is required.
4817The @samp{=} in @samp{=f} indicates that the operand is an output; all
4818output operands' constraints must use @samp{=}. The constraints use the
4819same language used in the machine description (@pxref{Constraints}).
4820
4821Each operand is described by an operand-constraint string followed by
4822the C expression in parentheses. A colon separates the assembler
4823template from the first output operand and another separates the last
4824output operand from the first input, if any. Commas separate the
84b72302
RH
4825operands within each group. The total number of operands is currently
4826limited to 30; this limitation may be lifted in some future version of
8a36672b 4827GCC@.
c85f7c16
JL
4828
4829If there are no output operands but there are input operands, you must
4830place two consecutive colons surrounding the place where the output
c1f7febf
RK
4831operands would go.
4832
84b72302
RH
4833As of GCC version 3.1, it is also possible to specify input and output
4834operands using symbolic names which can be referenced within the
4835assembler code. These names are specified inside square brackets
4836preceding the constraint string, and can be referenced inside the
4837assembler code using @code{%[@var{name}]} instead of a percentage sign
4838followed by the operand number. Using named operands the above example
4839could look like:
4840
3ab51846 4841@smallexample
84b72302
RH
4842asm ("fsinx %[angle],%[output]"
4843 : [output] "=f" (result)
4844 : [angle] "f" (angle));
3ab51846 4845@end smallexample
84b72302
RH
4846
4847@noindent
4848Note that the symbolic operand names have no relation whatsoever to
4849other C identifiers. You may use any name you like, even those of
64c18e57 4850existing C symbols, but you must ensure that no two operands within the same
84b72302
RH
4851assembler construct use the same symbolic name.
4852
c1f7febf 4853Output operand expressions must be lvalues; the compiler can check this.
c85f7c16
JL
4854The input operands need not be lvalues. The compiler cannot check
4855whether the operands have data types that are reasonable for the
4856instruction being executed. It does not parse the assembler instruction
4857template and does not know what it means or even whether it is valid
4858assembler input. The extended @code{asm} feature is most often used for
4859machine instructions the compiler itself does not know exist. If
4860the output expression cannot be directly addressed (for example, it is a
f0523f02 4861bit-field), your constraint must allow a register. In that case, GCC
c85f7c16
JL
4862will use the register as the output of the @code{asm}, and then store
4863that register into the output.
4864
f0523f02 4865The ordinary output operands must be write-only; GCC will assume that
c85f7c16
JL
4866the values in these operands before the instruction are dead and need
4867not be generated. Extended asm supports input-output or read-write
4868operands. Use the constraint character @samp{+} to indicate such an
373a04f1
JM
4869operand and list it with the output operands. You should only use
4870read-write operands when the constraints for the operand (or the
4871operand in which only some of the bits are to be changed) allow a
4872register.
4873
4874You may, as an alternative, logically split its function into two
4875separate operands, one input operand and one write-only output
4876operand. The connection between them is expressed by constraints
4877which say they need to be in the same location when the instruction
4878executes. You can use the same C expression for both operands, or
4879different expressions. For example, here we write the (fictitious)
4880@samp{combine} instruction with @code{bar} as its read-only source
4881operand and @code{foo} as its read-write destination:
c1f7febf 4882
3ab51846 4883@smallexample
c1f7febf 4884asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar));
3ab51846 4885@end smallexample
c1f7febf
RK
4886
4887@noindent
c85f7c16 4888The constraint @samp{"0"} for operand 1 says that it must occupy the
84b72302
RH
4889same location as operand 0. A number in constraint is allowed only in
4890an input operand and it must refer to an output operand.
c1f7febf 4891
84b72302 4892Only a number in the constraint can guarantee that one operand will be in
c85f7c16
JL
4893the same place as another. The mere fact that @code{foo} is the value
4894of both operands is not enough to guarantee that they will be in the
4895same place in the generated assembler code. The following would not
4896work reliably:
c1f7febf 4897
3ab51846 4898@smallexample
c1f7febf 4899asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar));
3ab51846 4900@end smallexample
c1f7febf
RK
4901
4902Various optimizations or reloading could cause operands 0 and 1 to be in
f0523f02 4903different registers; GCC knows no reason not to do so. For example, the
c1f7febf
RK
4904compiler might find a copy of the value of @code{foo} in one register and
4905use it for operand 1, but generate the output operand 0 in a different
4906register (copying it afterward to @code{foo}'s own address). Of course,
4907since the register for operand 1 is not even mentioned in the assembler
f0523f02 4908code, the result will not work, but GCC can't tell that.
c1f7febf 4909
84b72302
RH
4910As of GCC version 3.1, one may write @code{[@var{name}]} instead of
4911the operand number for a matching constraint. For example:
4912
3ab51846 4913@smallexample
84b72302
RH
4914asm ("cmoveq %1,%2,%[result]"
4915 : [result] "=r"(result)
4916 : "r" (test), "r"(new), "[result]"(old));
3ab51846 4917@end smallexample
84b72302 4918
805c33df
HPN
4919Sometimes you need to make an @code{asm} operand be a specific register,
4920but there's no matching constraint letter for that register @emph{by
4921itself}. To force the operand into that register, use a local variable
4922for the operand and specify the register in the variable declaration.
4923@xref{Explicit Reg Vars}. Then for the @code{asm} operand, use any
4924register constraint letter that matches the register:
4925
4926@smallexample
4927register int *p1 asm ("r0") = @dots{};
4928register int *p2 asm ("r1") = @dots{};
4929register int *result asm ("r0");
4930asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2));
4931@end smallexample
4932
b55d5746
HPN
4933@anchor{Example of asm with clobbered asm reg}
4934In the above example, beware that a register that is call-clobbered by
4935the target ABI will be overwritten by any function call in the
4936assignment, including library calls for arithmetic operators.
0c6390fa
L
4937Also a register may be clobbered when generating some operations,
4938like variable shift, memory copy or memory move on x86.
b55d5746
HPN
4939Assuming it is a call-clobbered register, this may happen to @code{r0}
4940above by the assignment to @code{p2}. If you have to use such a
4941register, use temporary variables for expressions between the register
4942assignment and use:
4943
4944@smallexample
4945int t1 = @dots{};
4946register int *p1 asm ("r0") = @dots{};
4947register int *p2 asm ("r1") = t1;
4948register int *result asm ("r0");
4949asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2));
4950@end smallexample
4951
c85f7c16
JL
4952Some instructions clobber specific hard registers. To describe this,
4953write a third colon after the input operands, followed by the names of
4954the clobbered hard registers (given as strings). Here is a realistic
4955example for the VAX:
c1f7febf 4956
3ab51846 4957@smallexample
c1f7febf 4958asm volatile ("movc3 %0,%1,%2"
12bcfaa1 4959 : /* @r{no outputs} */
c1f7febf
RK
4960 : "g" (from), "g" (to), "g" (count)
4961 : "r0", "r1", "r2", "r3", "r4", "r5");
3ab51846 4962@end smallexample
c1f7febf 4963
c5c76735
JL
4964You may not write a clobber description in a way that overlaps with an
4965input or output operand. For example, you may not have an operand
4966describing a register class with one member if you mention that register
acb5d088
HPN
4967in the clobber list. Variables declared to live in specific registers
4968(@pxref{Explicit Reg Vars}), and used as asm input or output operands must
4969have no part mentioned in the clobber description.
4970There is no way for you to specify that an input
c5c76735
JL
4971operand is modified without also specifying it as an output
4972operand. Note that if all the output operands you specify are for this
4973purpose (and hence unused), you will then also need to specify
4974@code{volatile} for the @code{asm} construct, as described below, to
f0523f02 4975prevent GCC from deleting the @code{asm} statement as unused.
8fe1938e 4976
c1f7febf 4977If you refer to a particular hardware register from the assembler code,
c85f7c16
JL
4978you will probably have to list the register after the third colon to
4979tell the compiler the register's value is modified. In some assemblers,
4980the register names begin with @samp{%}; to produce one @samp{%} in the
4981assembler code, you must write @samp{%%} in the input.
4982
4983If your assembler instruction can alter the condition code register, add
f0523f02 4984@samp{cc} to the list of clobbered registers. GCC on some machines
c85f7c16
JL
4985represents the condition codes as a specific hardware register;
4986@samp{cc} serves to name this register. On other machines, the
4987condition code is handled differently, and specifying @samp{cc} has no
4988effect. But it is valid no matter what the machine.
c1f7febf 4989
bbf5a54d 4990If your assembler instructions access memory in an unpredictable
c85f7c16 4991fashion, add @samp{memory} to the list of clobbered registers. This
bbf5a54d
AJ
4992will cause GCC to not keep memory values cached in registers across the
4993assembler instruction and not optimize stores or loads to that memory.
4994You will also want to add the @code{volatile} keyword if the memory
4995affected is not listed in the inputs or outputs of the @code{asm}, as
4996the @samp{memory} clobber does not count as a side-effect of the
4997@code{asm}. If you know how large the accessed memory is, you can add
4998it as input or output but if this is not known, you should add
4999@samp{memory}. As an example, if you access ten bytes of a string, you
5000can use a memory input like:
5001
cd1a8088 5002@smallexample
bbf5a54d 5003@{"m"( (@{ struct @{ char x[10]; @} *p = (void *)ptr ; *p; @}) )@}.
cd1a8088 5004@end smallexample
bbf5a54d
AJ
5005
5006Note that in the following example the memory input is necessary,
5007otherwise GCC might optimize the store to @code{x} away:
cd1a8088 5008@smallexample
bbf5a54d
AJ
5009int foo ()
5010@{
5011 int x = 42;
5012 int *y = &x;
5013 int result;
5014 asm ("magic stuff accessing an 'int' pointed to by '%1'"
5015 "=&d" (r) : "a" (y), "m" (*y));
f0eb93a8 5016 return result;
bbf5a54d 5017@}
cd1a8088 5018@end smallexample
c1f7febf 5019
c85f7c16 5020You can put multiple assembler instructions together in a single
8720914b
HPN
5021@code{asm} template, separated by the characters normally used in assembly
5022code for the system. A combination that works in most places is a newline
5023to break the line, plus a tab character to move to the instruction field
5024(written as @samp{\n\t}). Sometimes semicolons can be used, if the
5025assembler allows semicolons as a line-breaking character. Note that some
5026assembler dialects use semicolons to start a comment.
5027The input operands are guaranteed not to use any of the clobbered
c85f7c16
JL
5028registers, and neither will the output operands' addresses, so you can
5029read and write the clobbered registers as many times as you like. Here
5030is an example of multiple instructions in a template; it assumes the
5031subroutine @code{_foo} accepts arguments in registers 9 and 10:
c1f7febf 5032
3ab51846 5033@smallexample
8720914b 5034asm ("movl %0,r9\n\tmovl %1,r10\n\tcall _foo"
c1f7febf
RK
5035 : /* no outputs */
5036 : "g" (from), "g" (to)
5037 : "r9", "r10");
3ab51846 5038@end smallexample
c1f7febf 5039
f0523f02 5040Unless an output operand has the @samp{&} constraint modifier, GCC
c85f7c16
JL
5041may allocate it in the same register as an unrelated input operand, on
5042the assumption the inputs are consumed before the outputs are produced.
c1f7febf
RK
5043This assumption may be false if the assembler code actually consists of
5044more than one instruction. In such a case, use @samp{&} for each output
c85f7c16 5045operand that may not overlap an input. @xref{Modifiers}.
c1f7febf 5046
c85f7c16
JL
5047If you want to test the condition code produced by an assembler
5048instruction, you must include a branch and a label in the @code{asm}
5049construct, as follows:
c1f7febf 5050
3ab51846 5051@smallexample
8720914b 5052asm ("clr %0\n\tfrob %1\n\tbeq 0f\n\tmov #1,%0\n0:"
c1f7febf
RK
5053 : "g" (result)
5054 : "g" (input));
3ab51846 5055@end smallexample
c1f7febf
RK
5056
5057@noindent
5058This assumes your assembler supports local labels, as the GNU assembler
5059and most Unix assemblers do.
5060
5061Speaking of labels, jumps from one @code{asm} to another are not
c85f7c16
JL
5062supported. The compiler's optimizers do not know about these jumps, and
5063therefore they cannot take account of them when deciding how to
c1f7febf
RK
5064optimize.
5065
5066@cindex macros containing @code{asm}
5067Usually the most convenient way to use these @code{asm} instructions is to
5068encapsulate them in macros that look like functions. For example,
5069
3ab51846 5070@smallexample
c1f7febf
RK
5071#define sin(x) \
5072(@{ double __value, __arg = (x); \
5073 asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \
5074 __value; @})
3ab51846 5075@end smallexample
c1f7febf
RK
5076
5077@noindent
5078Here the variable @code{__arg} is used to make sure that the instruction
5079operates on a proper @code{double} value, and to accept only those
5080arguments @code{x} which can convert automatically to a @code{double}.
5081
c85f7c16
JL
5082Another way to make sure the instruction operates on the correct data
5083type is to use a cast in the @code{asm}. This is different from using a
c1f7febf
RK
5084variable @code{__arg} in that it converts more different types. For
5085example, if the desired type were @code{int}, casting the argument to
5086@code{int} would accept a pointer with no complaint, while assigning the
5087argument to an @code{int} variable named @code{__arg} would warn about
5088using a pointer unless the caller explicitly casts it.
5089
f0523f02 5090If an @code{asm} has output operands, GCC assumes for optimization
c85f7c16
JL
5091purposes the instruction has no side effects except to change the output
5092operands. This does not mean instructions with a side effect cannot be
5093used, but you must be careful, because the compiler may eliminate them
5094if the output operands aren't used, or move them out of loops, or
5095replace two with one if they constitute a common subexpression. Also,
5096if your instruction does have a side effect on a variable that otherwise
5097appears not to change, the old value of the variable may be reused later
5098if it happens to be found in a register.
c1f7febf 5099
2f59e40e
DJ
5100You can prevent an @code{asm} instruction from being deleted
5101by writing the keyword @code{volatile} after
c1f7febf
RK
5102the @code{asm}. For example:
5103
3ab51846 5104@smallexample
310668e8
JM
5105#define get_and_set_priority(new) \
5106(@{ int __old; \
5107 asm volatile ("get_and_set_priority %0, %1" \
5108 : "=g" (__old) : "g" (new)); \
c85f7c16 5109 __old; @})
3ab51846 5110@end smallexample
c1f7febf
RK
5111
5112@noindent
e71b34aa
MM
5113The @code{volatile} keyword indicates that the instruction has
5114important side-effects. GCC will not delete a volatile @code{asm} if
5115it is reachable. (The instruction can still be deleted if GCC can
5116prove that control-flow will never reach the location of the
f0eb93a8 5117instruction.) Note that even a volatile @code{asm} instruction
2f59e40e 5118can be moved relative to other code, including across jump
f0eb93a8
JM
5119instructions. For example, on many targets there is a system
5120register which can be set to control the rounding mode of
2f59e40e
DJ
5121floating point operations. You might try
5122setting it with a volatile @code{asm}, like this PowerPC example:
e71b34aa 5123
3ab51846 5124@smallexample
2f59e40e
DJ
5125 asm volatile("mtfsf 255,%0" : : "f" (fpenv));
5126 sum = x + y;
3ab51846 5127@end smallexample
e71b34aa 5128
ebb48a4d 5129@noindent
2f59e40e
DJ
5130This will not work reliably, as the compiler may move the addition back
5131before the volatile @code{asm}. To make it work you need to add an
5132artificial dependency to the @code{asm} referencing a variable in the code
5133you don't want moved, for example:
5134
5135@smallexample
5136 asm volatile ("mtfsf 255,%1" : "=X"(sum): "f"(fpenv));
5137 sum = x + y;
5138@end smallexample
5139
5140Similarly, you can't expect a
5141sequence of volatile @code{asm} instructions to remain perfectly
5142consecutive. If you want consecutive output, use a single @code{asm}.
5143Also, GCC will perform some optimizations across a volatile @code{asm}
5144instruction; GCC does not ``forget everything'' when it encounters
5145a volatile @code{asm} instruction the way some other compilers do.
5146
5147An @code{asm} instruction without any output operands will be treated
5148identically to a volatile @code{asm} instruction.
c1f7febf
RK
5149
5150It is a natural idea to look for a way to give access to the condition
5151code left by the assembler instruction. However, when we attempted to
5152implement this, we found no way to make it work reliably. The problem
5153is that output operands might need reloading, which would result in
5154additional following ``store'' instructions. On most machines, these
5155instructions would alter the condition code before there was time to
5156test it. This problem doesn't arise for ordinary ``test'' and
5157``compare'' instructions because they don't have any output operands.
5158
eda3fbbe
GB
5159For reasons similar to those described above, it is not possible to give
5160an assembler instruction access to the condition code left by previous
5161instructions.
5162
5490d604 5163If you are writing a header file that should be includable in ISO C
c1f7febf
RK
5164programs, write @code{__asm__} instead of @code{asm}. @xref{Alternate
5165Keywords}.
5166
ece7fc1c
RE
5167@subsection Size of an @code{asm}
5168
5169Some targets require that GCC track the size of each instruction used in
5170order to generate correct code. Because the final length of an
5171@code{asm} is only known by the assembler, GCC must make an estimate as
5172to how big it will be. The estimate is formed by counting the number of
5173statements in the pattern of the @code{asm} and multiplying that by the
5174length of the longest instruction on that processor. Statements in the
5175@code{asm} are identified by newline characters and whatever statement
5176separator characters are supported by the assembler; on most processors
5177this is the `@code{;}' character.
5178
5179Normally, GCC's estimate is perfectly adequate to ensure that correct
5180code is generated, but it is possible to confuse the compiler if you use
5181pseudo instructions or assembler macros that expand into multiple real
5182instructions or if you use assembler directives that expand to more
5183space in the object file than would be needed for a single instruction.
5184If this happens then the assembler will produce a diagnostic saying that
5185a label is unreachable.
5186
fe0ce426
JH
5187@subsection i386 floating point asm operands
5188
5189There are several rules on the usage of stack-like regs in
5190asm_operands insns. These rules apply only to the operands that are
5191stack-like regs:
5192
5193@enumerate
5194@item
5195Given a set of input regs that die in an asm_operands, it is
5196necessary to know which are implicitly popped by the asm, and
5197which must be explicitly popped by gcc.
5198
5199An input reg that is implicitly popped by the asm must be
5200explicitly clobbered, unless it is constrained to match an
5201output operand.
5202
5203@item
5204For any input reg that is implicitly popped by an asm, it is
5205necessary to know how to adjust the stack to compensate for the pop.
5206If any non-popped input is closer to the top of the reg-stack than
5207the implicitly popped reg, it would not be possible to know what the
84330467 5208stack looked like---it's not clear how the rest of the stack ``slides
fe0ce426
JH
5209up''.
5210
5211All implicitly popped input regs must be closer to the top of
5212the reg-stack than any input that is not implicitly popped.
5213
5214It is possible that if an input dies in an insn, reload might
5215use the input reg for an output reload. Consider this example:
5216
3ab51846 5217@smallexample
fe0ce426 5218asm ("foo" : "=t" (a) : "f" (b));
3ab51846 5219@end smallexample
fe0ce426
JH
5220
5221This asm says that input B is not popped by the asm, and that
c771326b 5222the asm pushes a result onto the reg-stack, i.e., the stack is one
fe0ce426
JH
5223deeper after the asm than it was before. But, it is possible that
5224reload will think that it can use the same reg for both the input and
5225the output, if input B dies in this insn.
5226
5227If any input operand uses the @code{f} constraint, all output reg
5228constraints must use the @code{&} earlyclobber.
5229
5230The asm above would be written as
5231
3ab51846 5232@smallexample
fe0ce426 5233asm ("foo" : "=&t" (a) : "f" (b));
3ab51846 5234@end smallexample
fe0ce426
JH
5235
5236@item
5237Some operands need to be in particular places on the stack. All
84330467 5238output operands fall in this category---there is no other way to
fe0ce426
JH
5239know which regs the outputs appear in unless the user indicates
5240this in the constraints.
5241
5242Output operands must specifically indicate which reg an output
5243appears in after an asm. @code{=f} is not allowed: the operand
5244constraints must select a class with a single reg.
5245
5246@item
5247Output operands may not be ``inserted'' between existing stack regs.
5248Since no 387 opcode uses a read/write operand, all output operands
5249are dead before the asm_operands, and are pushed by the asm_operands.
5250It makes no sense to push anywhere but the top of the reg-stack.
5251
5252Output operands must start at the top of the reg-stack: output
5253operands may not ``skip'' a reg.
5254
5255@item
5256Some asm statements may need extra stack space for internal
5257calculations. This can be guaranteed by clobbering stack registers
5258unrelated to the inputs and outputs.
5259
5260@end enumerate
5261
5262Here are a couple of reasonable asms to want to write. This asm
5263takes one input, which is internally popped, and produces two outputs.
5264
3ab51846 5265@smallexample
fe0ce426 5266asm ("fsincos" : "=t" (cos), "=u" (sin) : "0" (inp));
3ab51846 5267@end smallexample
fe0ce426
JH
5268
5269This asm takes two inputs, which are popped by the @code{fyl2xp1} opcode,
5270and replaces them with one output. The user must code the @code{st(1)}
5271clobber for reg-stack.c to know that @code{fyl2xp1} pops both inputs.
5272
3ab51846 5273@smallexample
fe0ce426 5274asm ("fyl2xp1" : "=t" (result) : "0" (x), "u" (y) : "st(1)");
3ab51846 5275@end smallexample
fe0ce426 5276
c1f7febf 5277@include md.texi
c1f7febf
RK
5278
5279@node Asm Labels
5280@section Controlling Names Used in Assembler Code
5281@cindex assembler names for identifiers
5282@cindex names used in assembler code
5283@cindex identifiers, names in assembler code
5284
5285You can specify the name to be used in the assembler code for a C
5286function or variable by writing the @code{asm} (or @code{__asm__})
5287keyword after the declarator as follows:
5288
3ab51846 5289@smallexample
c1f7febf 5290int foo asm ("myfoo") = 2;
3ab51846 5291@end smallexample
c1f7febf
RK
5292
5293@noindent
5294This specifies that the name to be used for the variable @code{foo} in
5295the assembler code should be @samp{myfoo} rather than the usual
5296@samp{_foo}.
5297
5298On systems where an underscore is normally prepended to the name of a C
5299function or variable, this feature allows you to define names for the
5300linker that do not start with an underscore.
5301
0adc3c19
MM
5302It does not make sense to use this feature with a non-static local
5303variable since such variables do not have assembler names. If you are
5304trying to put the variable in a particular register, see @ref{Explicit
5305Reg Vars}. GCC presently accepts such code with a warning, but will
5306probably be changed to issue an error, rather than a warning, in the
5307future.
5308
c1f7febf
RK
5309You cannot use @code{asm} in this way in a function @emph{definition}; but
5310you can get the same effect by writing a declaration for the function
5311before its definition and putting @code{asm} there, like this:
5312
3ab51846 5313@smallexample
c1f7febf
RK
5314extern func () asm ("FUNC");
5315
5316func (x, y)
5317 int x, y;
0d893a63 5318/* @r{@dots{}} */
3ab51846 5319@end smallexample
c1f7febf
RK
5320
5321It is up to you to make sure that the assembler names you choose do not
5322conflict with any other assembler symbols. Also, you must not use a
f0523f02
JM
5323register name; that would produce completely invalid assembler code. GCC
5324does not as yet have the ability to store static variables in registers.
c1f7febf
RK
5325Perhaps that will be added.
5326
5327@node Explicit Reg Vars
5328@section Variables in Specified Registers
5329@cindex explicit register variables
5330@cindex variables in specified registers
5331@cindex specified registers
5332@cindex registers, global allocation
5333
5334GNU C allows you to put a few global variables into specified hardware
5335registers. You can also specify the register in which an ordinary
5336register variable should be allocated.
5337
5338@itemize @bullet
5339@item
5340Global register variables reserve registers throughout the program.
5341This may be useful in programs such as programming language
5342interpreters which have a couple of global variables that are accessed
5343very often.
5344
5345@item
5346Local register variables in specific registers do not reserve the
805c33df
HPN
5347registers, except at the point where they are used as input or output
5348operands in an @code{asm} statement and the @code{asm} statement itself is
5349not deleted. The compiler's data flow analysis is capable of determining
c1f7febf 5350where the specified registers contain live values, and where they are
8d344fbc 5351available for other uses. Stores into local register variables may be deleted
0deaf590
JL
5352when they appear to be dead according to dataflow analysis. References
5353to local register variables may be deleted or moved or simplified.
c1f7febf
RK
5354
5355These local variables are sometimes convenient for use with the extended
5356@code{asm} feature (@pxref{Extended Asm}), if you want to write one
5357output of the assembler instruction directly into a particular register.
5358(This will work provided the register you specify fits the constraints
5359specified for that operand in the @code{asm}.)
5360@end itemize
5361
5362@menu
5363* Global Reg Vars::
5364* Local Reg Vars::
5365@end menu
5366
5367@node Global Reg Vars
5368@subsection Defining Global Register Variables
5369@cindex global register variables
5370@cindex registers, global variables in
5371
5372You can define a global register variable in GNU C like this:
5373
3ab51846 5374@smallexample
c1f7febf 5375register int *foo asm ("a5");
3ab51846 5376@end smallexample
c1f7febf
RK
5377
5378@noindent
5379Here @code{a5} is the name of the register which should be used. Choose a
5380register which is normally saved and restored by function calls on your
5381machine, so that library routines will not clobber it.
5382
5383Naturally the register name is cpu-dependent, so you would need to
5384conditionalize your program according to cpu type. The register
5385@code{a5} would be a good choice on a 68000 for a variable of pointer
5386type. On machines with register windows, be sure to choose a ``global''
5387register that is not affected magically by the function call mechanism.
5388
5389In addition, operating systems on one type of cpu may differ in how they
5390name the registers; then you would need additional conditionals. For
5391example, some 68000 operating systems call this register @code{%a5}.
5392
5393Eventually there may be a way of asking the compiler to choose a register
5394automatically, but first we need to figure out how it should choose and
5395how to enable you to guide the choice. No solution is evident.
5396
5397Defining a global register variable in a certain register reserves that
5398register entirely for this use, at least within the current compilation.
5399The register will not be allocated for any other purpose in the functions
5400in the current compilation. The register will not be saved and restored by
5401these functions. Stores into this register are never deleted even if they
5402would appear to be dead, but references may be deleted or moved or
5403simplified.
5404
5405It is not safe to access the global register variables from signal
5406handlers, or from more than one thread of control, because the system
5407library routines may temporarily use the register for other things (unless
5408you recompile them specially for the task at hand).
5409
5410@cindex @code{qsort}, and global register variables
5411It is not safe for one function that uses a global register variable to
5412call another such function @code{foo} by way of a third function
e979f9e8 5413@code{lose} that was compiled without knowledge of this variable (i.e.@: in a
c1f7febf
RK
5414different source file in which the variable wasn't declared). This is
5415because @code{lose} might save the register and put some other value there.
5416For example, you can't expect a global register variable to be available in
5417the comparison-function that you pass to @code{qsort}, since @code{qsort}
5418might have put something else in that register. (If you are prepared to
5419recompile @code{qsort} with the same global register variable, you can
5420solve this problem.)
5421
5422If you want to recompile @code{qsort} or other source files which do not
5423actually use your global register variable, so that they will not use that
5424register for any other purpose, then it suffices to specify the compiler
84330467 5425option @option{-ffixed-@var{reg}}. You need not actually add a global
c1f7febf
RK
5426register declaration to their source code.
5427
5428A function which can alter the value of a global register variable cannot
5429safely be called from a function compiled without this variable, because it
5430could clobber the value the caller expects to find there on return.
5431Therefore, the function which is the entry point into the part of the
5432program that uses the global register variable must explicitly save and
5433restore the value which belongs to its caller.
5434
5435@cindex register variable after @code{longjmp}
5436@cindex global register after @code{longjmp}
5437@cindex value after @code{longjmp}
5438@findex longjmp
5439@findex setjmp
5440On most machines, @code{longjmp} will restore to each global register
5441variable the value it had at the time of the @code{setjmp}. On some
5442machines, however, @code{longjmp} will not change the value of global
5443register variables. To be portable, the function that called @code{setjmp}
5444should make other arrangements to save the values of the global register
5445variables, and to restore them in a @code{longjmp}. This way, the same
5446thing will happen regardless of what @code{longjmp} does.
5447
5448All global register variable declarations must precede all function
5449definitions. If such a declaration could appear after function
5450definitions, the declaration would be too late to prevent the register from
5451being used for other purposes in the preceding functions.
5452
5453Global register variables may not have initial values, because an
5454executable file has no means to supply initial contents for a register.
5455
981f6289 5456On the SPARC, there are reports that g3 @dots{} g7 are suitable
c1f7febf
RK
5457registers, but certain library functions, such as @code{getwd}, as well
5458as the subroutines for division and remainder, modify g3 and g4. g1 and
5459g2 are local temporaries.
5460
5461On the 68000, a2 @dots{} a5 should be suitable, as should d2 @dots{} d7.
5462Of course, it will not do to use more than a few of those.
5463
5464@node Local Reg Vars
5465@subsection Specifying Registers for Local Variables
5466@cindex local variables, specifying registers
5467@cindex specifying registers for local variables
5468@cindex registers for local variables
5469
5470You can define a local register variable with a specified register
5471like this:
5472
3ab51846 5473@smallexample
c1f7febf 5474register int *foo asm ("a5");
3ab51846 5475@end smallexample
c1f7febf
RK
5476
5477@noindent
5478Here @code{a5} is the name of the register which should be used. Note
5479that this is the same syntax used for defining global register
5480variables, but for a local variable it would appear within a function.
5481
5482Naturally the register name is cpu-dependent, but this is not a
5483problem, since specific registers are most often useful with explicit
5484assembler instructions (@pxref{Extended Asm}). Both of these things
5485generally require that you conditionalize your program according to
5486cpu type.
5487
5488In addition, operating systems on one type of cpu may differ in how they
5489name the registers; then you would need additional conditionals. For
5490example, some 68000 operating systems call this register @code{%a5}.
5491
c1f7febf
RK
5492Defining such a register variable does not reserve the register; it
5493remains available for other uses in places where flow control determines
d754127f 5494the variable's value is not live.
e5e809f4 5495
f0523f02 5496This option does not guarantee that GCC will generate code that has
e5e809f4 5497this variable in the register you specify at all times. You may not
805c33df
HPN
5498code an explicit reference to this register in the @emph{assembler
5499instruction template} part of an @code{asm} statement and assume it will
5500always refer to this variable. However, using the variable as an
5501@code{asm} @emph{operand} guarantees that the specified register is used
5502for the operand.
c1f7febf 5503
8d344fbc 5504Stores into local register variables may be deleted when they appear to be dead
0deaf590
JL
5505according to dataflow analysis. References to local register variables may
5506be deleted or moved or simplified.
5507
b55d5746
HPN
5508As for global register variables, it's recommended that you choose a
5509register which is normally saved and restored by function calls on
5510your machine, so that library routines will not clobber it. A common
5511pitfall is to initialize multiple call-clobbered registers with
5512arbitrary expressions, where a function call or library call for an
5513arithmetic operator will overwrite a register value from a previous
5514assignment, for example @code{r0} below:
5515@smallexample
5516register int *p1 asm ("r0") = @dots{};
5517register int *p2 asm ("r1") = @dots{};
5518@end smallexample
5519In those cases, a solution is to use a temporary variable for
5520each arbitrary expression. @xref{Example of asm with clobbered asm reg}.
5521
c1f7febf
RK
5522@node Alternate Keywords
5523@section Alternate Keywords
5524@cindex alternate keywords
5525@cindex keywords, alternate
5526
5490d604 5527@option{-ansi} and the various @option{-std} options disable certain
f458d1d5
ZW
5528keywords. This causes trouble when you want to use GNU C extensions, or
5529a general-purpose header file that should be usable by all programs,
5530including ISO C programs. The keywords @code{asm}, @code{typeof} and
5531@code{inline} are not available in programs compiled with
5532@option{-ansi} or @option{-std} (although @code{inline} can be used in a
5533program compiled with @option{-std=c99}). The ISO C99 keyword
5490d604
JM
5534@code{restrict} is only available when @option{-std=gnu99} (which will
5535eventually be the default) or @option{-std=c99} (or the equivalent
bd819a4a 5536@option{-std=iso9899:1999}) is used.
c1f7febf
RK
5537
5538The way to solve these problems is to put @samp{__} at the beginning and
5539end of each problematical keyword. For example, use @code{__asm__}
f458d1d5 5540instead of @code{asm}, and @code{__inline__} instead of @code{inline}.
c1f7febf
RK
5541
5542Other C compilers won't accept these alternative keywords; if you want to
5543compile with another compiler, you can define the alternate keywords as
5544macros to replace them with the customary keywords. It looks like this:
5545
3ab51846 5546@smallexample
c1f7febf
RK
5547#ifndef __GNUC__
5548#define __asm__ asm
5549#endif
3ab51846 5550@end smallexample
c1f7febf 5551
6e6b0525 5552@findex __extension__
84330467
JM
5553@opindex pedantic
5554@option{-pedantic} and other options cause warnings for many GNU C extensions.
dbe519e0 5555You can
c1f7febf
RK
5556prevent such warnings within one expression by writing
5557@code{__extension__} before the expression. @code{__extension__} has no
5558effect aside from this.
5559
5560@node Incomplete Enums
5561@section Incomplete @code{enum} Types
5562
5563You can define an @code{enum} tag without specifying its possible values.
5564This results in an incomplete type, much like what you get if you write
5565@code{struct foo} without describing the elements. A later declaration
5566which does specify the possible values completes the type.
5567
5568You can't allocate variables or storage using the type while it is
5569incomplete. However, you can work with pointers to that type.
5570
5571This extension may not be very useful, but it makes the handling of
5572@code{enum} more consistent with the way @code{struct} and @code{union}
5573are handled.
5574
5575This extension is not supported by GNU C++.
5576
5577@node Function Names
5578@section Function Names as Strings
e6cc3a24 5579@cindex @code{__func__} identifier
4b404517
JM
5580@cindex @code{__FUNCTION__} identifier
5581@cindex @code{__PRETTY_FUNCTION__} identifier
c1f7febf 5582
e6cc3a24
ZW
5583GCC provides three magic variables which hold the name of the current
5584function, as a string. The first of these is @code{__func__}, which
5585is part of the C99 standard:
5586
e6cc3a24
ZW
5587The identifier @code{__func__} is implicitly declared by the translator
5588as if, immediately following the opening brace of each function
5589definition, the declaration
5590
5591@smallexample
5592static const char __func__[] = "function-name";
5593@end smallexample
c1f7febf 5594
38bb2b65 5595@noindent
e6cc3a24
ZW
5596appeared, where function-name is the name of the lexically-enclosing
5597function. This name is the unadorned name of the function.
e6cc3a24
ZW
5598
5599@code{__FUNCTION__} is another name for @code{__func__}. Older
5600versions of GCC recognize only this name. However, it is not
5601standardized. For maximum portability, we recommend you use
5602@code{__func__}, but provide a fallback definition with the
5603preprocessor:
5604
5605@smallexample
5606#if __STDC_VERSION__ < 199901L
5607# if __GNUC__ >= 2
5608# define __func__ __FUNCTION__
5609# else
5610# define __func__ "<unknown>"
5611# endif
5612#endif
5613@end smallexample
5614
5615In C, @code{__PRETTY_FUNCTION__} is yet another name for
5616@code{__func__}. However, in C++, @code{__PRETTY_FUNCTION__} contains
5617the type signature of the function as well as its bare name. For
5618example, this program:
c1f7febf
RK
5619
5620@smallexample
5621extern "C" @{
5622extern int printf (char *, ...);
5623@}
5624
5625class a @{
5626 public:
a721a601 5627 void sub (int i)
c1f7febf
RK
5628 @{
5629 printf ("__FUNCTION__ = %s\n", __FUNCTION__);
5630 printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
5631 @}
5632@};
5633
5634int
5635main (void)
5636@{
5637 a ax;
5638 ax.sub (0);
5639 return 0;
5640@}
5641@end smallexample
5642
5643@noindent
5644gives this output:
5645
5646@smallexample
5647__FUNCTION__ = sub
e6cc3a24 5648__PRETTY_FUNCTION__ = void a::sub(int)
22acfb79
NM
5649@end smallexample
5650
e6cc3a24
ZW
5651These identifiers are not preprocessor macros. In GCC 3.3 and
5652earlier, in C only, @code{__FUNCTION__} and @code{__PRETTY_FUNCTION__}
5653were treated as string literals; they could be used to initialize
5654@code{char} arrays, and they could be concatenated with other string
5655literals. GCC 3.4 and later treat them as variables, like
5656@code{__func__}. In C++, @code{__FUNCTION__} and
5657@code{__PRETTY_FUNCTION__} have always been variables.
22acfb79 5658
c1f7febf
RK
5659@node Return Address
5660@section Getting the Return or Frame Address of a Function
5661
5662These functions may be used to get information about the callers of a
5663function.
5664
84330467 5665@deftypefn {Built-in Function} {void *} __builtin_return_address (unsigned int @var{level})
c1f7febf
RK
5666This function returns the return address of the current function, or of
5667one of its callers. The @var{level} argument is number of frames to
5668scan up the call stack. A value of @code{0} yields the return address
5669of the current function, a value of @code{1} yields the return address
8a36672b 5670of the caller of the current function, and so forth. When inlining
95b1627e
EC
5671the expected behavior is that the function will return the address of
5672the function that will be returned to. To work around this behavior use
5673the @code{noinline} function attribute.
c1f7febf
RK
5674
5675The @var{level} argument must be a constant integer.
5676
5677On some machines it may be impossible to determine the return address of
5678any function other than the current one; in such cases, or when the top
dd96fbc5 5679of the stack has been reached, this function will return @code{0} or a
8a36672b 5680random value. In addition, @code{__builtin_frame_address} may be used
dd96fbc5 5681to determine if the top of the stack has been reached.
c1f7febf 5682
df2a54e9 5683This function should only be used with a nonzero argument for debugging
c1f7febf 5684purposes.
84330467 5685@end deftypefn
c1f7febf 5686
84330467 5687@deftypefn {Built-in Function} {void *} __builtin_frame_address (unsigned int @var{level})
c1f7febf
RK
5688This function is similar to @code{__builtin_return_address}, but it
5689returns the address of the function frame rather than the return address
5690of the function. Calling @code{__builtin_frame_address} with a value of
5691@code{0} yields the frame address of the current function, a value of
5692@code{1} yields the frame address of the caller of the current function,
5693and so forth.
5694
5695The frame is the area on the stack which holds local variables and saved
5696registers. The frame address is normally the address of the first word
5697pushed on to the stack by the function. However, the exact definition
5698depends upon the processor and the calling convention. If the processor
5699has a dedicated frame pointer register, and the function has a frame,
5700then @code{__builtin_frame_address} will return the value of the frame
5701pointer register.
5702
dd96fbc5
L
5703On some machines it may be impossible to determine the frame address of
5704any function other than the current one; in such cases, or when the top
5705of the stack has been reached, this function will return @code{0} if
5706the first frame pointer is properly initialized by the startup code.
5707
df2a54e9 5708This function should only be used with a nonzero argument for debugging
dd96fbc5 5709purposes.
84330467 5710@end deftypefn
c1f7febf 5711
1255c85c
BS
5712@node Vector Extensions
5713@section Using vector instructions through built-in functions
5714
5715On some targets, the instruction set contains SIMD vector instructions that
5716operate on multiple values contained in one large register at the same time.
5717For example, on the i386 the MMX, 3Dnow! and SSE extensions can be used
5718this way.
5719
5720The first step in using these extensions is to provide the necessary data
5721types. This should be done using an appropriate @code{typedef}:
5722
3ab51846 5723@smallexample
4a5eab38 5724typedef int v4si __attribute__ ((vector_size (16)));
3ab51846 5725@end smallexample
1255c85c 5726
4a5eab38
PB
5727The @code{int} type specifies the base type, while the attribute specifies
5728the vector size for the variable, measured in bytes. For example, the
5729declaration above causes the compiler to set the mode for the @code{v4si}
5730type to be 16 bytes wide and divided into @code{int} sized units. For
5731a 32-bit @code{int} this means a vector of 4 units of 4 bytes, and the
5732corresponding mode of @code{foo} will be @acronym{V4SI}.
1255c85c 5733
4a5eab38
PB
5734The @code{vector_size} attribute is only applicable to integral and
5735float scalars, although arrays, pointers, and function return values
5736are allowed in conjunction with this construct.
5737
5738All the basic integer types can be used as base types, both as signed
5739and as unsigned: @code{char}, @code{short}, @code{int}, @code{long},
5740@code{long long}. In addition, @code{float} and @code{double} can be
5741used to build floating-point vector types.
1255c85c 5742
cb2a532e 5743Specifying a combination that is not valid for the current architecture
2dd76960 5744will cause GCC to synthesize the instructions using a narrower mode.
cb2a532e 5745For example, if you specify a variable of type @code{V4SI} and your
2dd76960 5746architecture does not allow for this specific SIMD type, GCC will
cb2a532e
AH
5747produce code that uses 4 @code{SIs}.
5748
5749The types defined in this manner can be used with a subset of normal C
2dd76960 5750operations. Currently, GCC will allow using the following operators
5cfd5d9b 5751on these types: @code{+, -, *, /, unary minus, ^, |, &, ~, %}@.
cb2a532e
AH
5752
5753The operations behave like C++ @code{valarrays}. Addition is defined as
5754the addition of the corresponding elements of the operands. For
5755example, in the code below, each of the 4 elements in @var{a} will be
5756added to the corresponding 4 elements in @var{b} and the resulting
5757vector will be stored in @var{c}.
5758
3ab51846 5759@smallexample
4a5eab38 5760typedef int v4si __attribute__ ((vector_size (16)));
cb2a532e
AH
5761
5762v4si a, b, c;
5763
5764c = a + b;
3ab51846 5765@end smallexample
cb2a532e 5766
3a3e1600
GK
5767Subtraction, multiplication, division, and the logical operations
5768operate in a similar manner. Likewise, the result of using the unary
5769minus or complement operators on a vector type is a vector whose
5770elements are the negative or complemented values of the corresponding
cb2a532e
AH
5771elements in the operand.
5772
5773You can declare variables and use them in function calls and returns, as
5774well as in assignments and some casts. You can specify a vector type as
5775a return type for a function. Vector types can also be used as function
5776arguments. It is possible to cast from one vector type to another,
5777provided they are of the same size (in fact, you can also cast vectors
5778to and from other datatypes of the same size).
5779
5780You cannot operate between vectors of different lengths or different
90a21764 5781signedness without a cast.
cb2a532e
AH
5782
5783A port that supports hardware vector operations, usually provides a set
5784of built-in functions that can be used to operate on vectors. For
5785example, a function to add two vectors and multiply the result by a
5786third could look like this:
1255c85c 5787
3ab51846 5788@smallexample
1255c85c
BS
5789v4si f (v4si a, v4si b, v4si c)
5790@{
5791 v4si tmp = __builtin_addv4si (a, b);
5792 return __builtin_mulv4si (tmp, c);
5793@}
5794
3ab51846 5795@end smallexample
1255c85c 5796
7a3ea201
RH
5797@node Offsetof
5798@section Offsetof
5799@findex __builtin_offsetof
5800
5801GCC implements for both C and C++ a syntactic extension to implement
5802the @code{offsetof} macro.
5803
5804@smallexample
5805primary:
6ccde948 5806 "__builtin_offsetof" "(" @code{typename} "," offsetof_member_designator ")"
7a3ea201
RH
5807
5808offsetof_member_designator:
6ccde948
RW
5809 @code{identifier}
5810 | offsetof_member_designator "." @code{identifier}
5811 | offsetof_member_designator "[" @code{expr} "]"
7a3ea201
RH
5812@end smallexample
5813
5814This extension is sufficient such that
5815
5816@smallexample
5817#define offsetof(@var{type}, @var{member}) __builtin_offsetof (@var{type}, @var{member})
5818@end smallexample
5819
5820is a suitable definition of the @code{offsetof} macro. In C++, @var{type}
5821may be dependent. In either case, @var{member} may consist of a single
5822identifier, or a sequence of member accesses and array references.
5823
48ae6c13
RH
5824@node Atomic Builtins
5825@section Built-in functions for atomic memory access
5826
5827The following builtins are intended to be compatible with those described
5828in the @cite{Intel Itanium Processor-specific Application Binary Interface},
5829section 7.4. As such, they depart from the normal GCC practice of using
5830the ``__builtin_'' prefix, and further that they are overloaded such that
5831they work on multiple types.
5832
5833The definition given in the Intel documentation allows only for the use of
5834the types @code{int}, @code{long}, @code{long long} as well as their unsigned
5835counterparts. GCC will allow any integral scalar or pointer type that is
58361, 2, 4 or 8 bytes in length.
5837
5838Not all operations are supported by all target processors. If a particular
5839operation cannot be implemented on the target processor, a warning will be
5840generated and a call an external function will be generated. The external
5841function will carry the same name as the builtin, with an additional suffix
5842@samp{_@var{n}} where @var{n} is the size of the data type.
5843
5844@c ??? Should we have a mechanism to suppress this warning? This is almost
5845@c useful for implementing the operation under the control of an external
5846@c mutex.
5847
5848In most cases, these builtins are considered a @dfn{full barrier}. That is,
5849no memory operand will be moved across the operation, either forward or
5850backward. Further, instructions will be issued as necessary to prevent the
5851processor from speculating loads across the operation and from queuing stores
5852after the operation.
5853
d1facce0 5854All of the routines are described in the Intel documentation to take
48ae6c13
RH
5855``an optional list of variables protected by the memory barrier''. It's
5856not clear what is meant by that; it could mean that @emph{only} the
5857following variables are protected, or it could mean that these variables
5858should in addition be protected. At present GCC ignores this list and
5859protects all variables which are globally accessible. If in the future
5860we make some use of this list, an empty list will continue to mean all
5861globally accessible variables.
5862
5863@table @code
5864@item @var{type} __sync_fetch_and_add (@var{type} *ptr, @var{type} value, ...)
5865@itemx @var{type} __sync_fetch_and_sub (@var{type} *ptr, @var{type} value, ...)
5866@itemx @var{type} __sync_fetch_and_or (@var{type} *ptr, @var{type} value, ...)
5867@itemx @var{type} __sync_fetch_and_and (@var{type} *ptr, @var{type} value, ...)
5868@itemx @var{type} __sync_fetch_and_xor (@var{type} *ptr, @var{type} value, ...)
5869@itemx @var{type} __sync_fetch_and_nand (@var{type} *ptr, @var{type} value, ...)
5870@findex __sync_fetch_and_add
5871@findex __sync_fetch_and_sub
5872@findex __sync_fetch_and_or
5873@findex __sync_fetch_and_and
5874@findex __sync_fetch_and_xor
5875@findex __sync_fetch_and_nand
5876These builtins perform the operation suggested by the name, and
5877returns the value that had previously been in memory. That is,
5878
5879@smallexample
5880@{ tmp = *ptr; *ptr @var{op}= value; return tmp; @}
23462d4d 5881@{ tmp = *ptr; *ptr = ~(tmp & value); return tmp; @} // nand
48ae6c13
RH
5882@end smallexample
5883
23462d4d
UB
5884@emph{Note:} GCC 4.4 and later implement @code{__sync_fetch_and_nand}
5885builtin as @code{*ptr = ~(tmp & value)} instead of @code{*ptr = ~tmp & value}.
5886
48ae6c13
RH
5887@item @var{type} __sync_add_and_fetch (@var{type} *ptr, @var{type} value, ...)
5888@itemx @var{type} __sync_sub_and_fetch (@var{type} *ptr, @var{type} value, ...)
5889@itemx @var{type} __sync_or_and_fetch (@var{type} *ptr, @var{type} value, ...)
5890@itemx @var{type} __sync_and_and_fetch (@var{type} *ptr, @var{type} value, ...)
5891@itemx @var{type} __sync_xor_and_fetch (@var{type} *ptr, @var{type} value, ...)
5892@itemx @var{type} __sync_nand_and_fetch (@var{type} *ptr, @var{type} value, ...)
5893@findex __sync_add_and_fetch
5894@findex __sync_sub_and_fetch
5895@findex __sync_or_and_fetch
5896@findex __sync_and_and_fetch
5897@findex __sync_xor_and_fetch
5898@findex __sync_nand_and_fetch
5899These builtins perform the operation suggested by the name, and
5900return the new value. That is,
5901
5902@smallexample
5903@{ *ptr @var{op}= value; return *ptr; @}
23462d4d 5904@{ *ptr = ~(*ptr & value); return *ptr; @} // nand
48ae6c13
RH
5905@end smallexample
5906
23462d4d
UB
5907@emph{Note:} GCC 4.4 and later implement @code{__sync_nand_and_fetch}
5908builtin as @code{*ptr = ~(*ptr & value)} instead of
5909@code{*ptr = ~*ptr & value}.
5910
48ae6c13
RH
5911@item bool __sync_bool_compare_and_swap (@var{type} *ptr, @var{type} oldval @var{type} newval, ...)
5912@itemx @var{type} __sync_val_compare_and_swap (@var{type} *ptr, @var{type} oldval @var{type} newval, ...)
5913@findex __sync_bool_compare_and_swap
5914@findex __sync_val_compare_and_swap
5915These builtins perform an atomic compare and swap. That is, if the current
5916value of @code{*@var{ptr}} is @var{oldval}, then write @var{newval} into
5917@code{*@var{ptr}}.
5918
0ac11108 5919The ``bool'' version returns true if the comparison is successful and
48ae6c13 5920@var{newval} was written. The ``val'' version returns the contents
f12b785d 5921of @code{*@var{ptr}} before the operation.
48ae6c13
RH
5922
5923@item __sync_synchronize (...)
5924@findex __sync_synchronize
5925This builtin issues a full memory barrier.
5926
5927@item @var{type} __sync_lock_test_and_set (@var{type} *ptr, @var{type} value, ...)
5928@findex __sync_lock_test_and_set
5929This builtin, as described by Intel, is not a traditional test-and-set
5930operation, but rather an atomic exchange operation. It writes @var{value}
5931into @code{*@var{ptr}}, and returns the previous contents of
5932@code{*@var{ptr}}.
5933
5934Many targets have only minimal support for such locks, and do not support
5935a full exchange operation. In this case, a target may support reduced
5936functionality here by which the @emph{only} valid value to store is the
5937immediate constant 1. The exact value actually stored in @code{*@var{ptr}}
5938is implementation defined.
5939
5940This builtin is not a full barrier, but rather an @dfn{acquire barrier}.
5941This means that references after the builtin cannot move to (or be
5942speculated to) before the builtin, but previous memory stores may not
0ac11108 5943be globally visible yet, and previous memory loads may not yet be
48ae6c13
RH
5944satisfied.
5945
5946@item void __sync_lock_release (@var{type} *ptr, ...)
5947@findex __sync_lock_release
5948This builtin releases the lock acquired by @code{__sync_lock_test_and_set}.
5949Normally this means writing the constant 0 to @code{*@var{ptr}}.
5950
5951This builtin is not a full barrier, but rather a @dfn{release barrier}.
5952This means that all previous memory stores are globally visible, and all
5953previous memory loads have been satisfied, but following memory reads
5954are not prevented from being speculated to before the barrier.
5955@end table
5956
10a0d495
JJ
5957@node Object Size Checking
5958@section Object Size Checking Builtins
5959@findex __builtin_object_size
5960@findex __builtin___memcpy_chk
5961@findex __builtin___mempcpy_chk
5962@findex __builtin___memmove_chk
5963@findex __builtin___memset_chk
5964@findex __builtin___strcpy_chk
5965@findex __builtin___stpcpy_chk
5966@findex __builtin___strncpy_chk
5967@findex __builtin___strcat_chk
5968@findex __builtin___strncat_chk
5969@findex __builtin___sprintf_chk
5970@findex __builtin___snprintf_chk
5971@findex __builtin___vsprintf_chk
5972@findex __builtin___vsnprintf_chk
5973@findex __builtin___printf_chk
5974@findex __builtin___vprintf_chk
5975@findex __builtin___fprintf_chk
5976@findex __builtin___vfprintf_chk
5977
5978GCC implements a limited buffer overflow protection mechanism
5979that can prevent some buffer overflow attacks.
5980
5981@deftypefn {Built-in Function} {size_t} __builtin_object_size (void * @var{ptr}, int @var{type})
5982is a built-in construct that returns a constant number of bytes from
5983@var{ptr} to the end of the object @var{ptr} pointer points to
5984(if known at compile time). @code{__builtin_object_size} never evaluates
5985its arguments for side-effects. If there are any side-effects in them, it
5986returns @code{(size_t) -1} for @var{type} 0 or 1 and @code{(size_t) 0}
5987for @var{type} 2 or 3. If there are multiple objects @var{ptr} can
5988point to and all of them are known at compile time, the returned number
5989is the maximum of remaining byte counts in those objects if @var{type} & 2 is
a4d05547 59900 and minimum if nonzero. If it is not possible to determine which objects
10a0d495
JJ
5991@var{ptr} points to at compile time, @code{__builtin_object_size} should
5992return @code{(size_t) -1} for @var{type} 0 or 1 and @code{(size_t) 0}
5993for @var{type} 2 or 3.
5994
5995@var{type} is an integer constant from 0 to 3. If the least significant
5996bit is clear, objects are whole variables, if it is set, a closest
5997surrounding subobject is considered the object a pointer points to.
5998The second bit determines if maximum or minimum of remaining bytes
5999is computed.
6000
6001@smallexample
6002struct V @{ char buf1[10]; int b; char buf2[10]; @} var;
6003char *p = &var.buf1[1], *q = &var.b;
6004
6005/* Here the object p points to is var. */
6006assert (__builtin_object_size (p, 0) == sizeof (var) - 1);
6007/* The subobject p points to is var.buf1. */
6008assert (__builtin_object_size (p, 1) == sizeof (var.buf1) - 1);
6009/* The object q points to is var. */
6010assert (__builtin_object_size (q, 0)
6ccde948 6011 == (char *) (&var + 1) - (char *) &var.b);
10a0d495
JJ
6012/* The subobject q points to is var.b. */
6013assert (__builtin_object_size (q, 1) == sizeof (var.b));
6014@end smallexample
6015@end deftypefn
6016
6017There are built-in functions added for many common string operation
021efafc 6018functions, e.g., for @code{memcpy} @code{__builtin___memcpy_chk}
10a0d495
JJ
6019built-in is provided. This built-in has an additional last argument,
6020which is the number of bytes remaining in object the @var{dest}
6021argument points to or @code{(size_t) -1} if the size is not known.
6022
6023The built-in functions are optimized into the normal string functions
6024like @code{memcpy} if the last argument is @code{(size_t) -1} or if
6025it is known at compile time that the destination object will not
6026be overflown. If the compiler can determine at compile time the
6027object will be always overflown, it issues a warning.
6028
6029The intended use can be e.g.
6030
6031@smallexample
6032#undef memcpy
6033#define bos0(dest) __builtin_object_size (dest, 0)
6034#define memcpy(dest, src, n) \
6035 __builtin___memcpy_chk (dest, src, n, bos0 (dest))
6036
6037char *volatile p;
6038char buf[10];
6039/* It is unknown what object p points to, so this is optimized
6040 into plain memcpy - no checking is possible. */
6041memcpy (p, "abcde", n);
6042/* Destination is known and length too. It is known at compile
6043 time there will be no overflow. */
6044memcpy (&buf[5], "abcde", 5);
6045/* Destination is known, but the length is not known at compile time.
6046 This will result in __memcpy_chk call that can check for overflow
6047 at runtime. */
6048memcpy (&buf[5], "abcde", n);
6049/* Destination is known and it is known at compile time there will
6050 be overflow. There will be a warning and __memcpy_chk call that
6051 will abort the program at runtime. */
6052memcpy (&buf[6], "abcde", 5);
6053@end smallexample
6054
6055Such built-in functions are provided for @code{memcpy}, @code{mempcpy},
6056@code{memmove}, @code{memset}, @code{strcpy}, @code{stpcpy}, @code{strncpy},
6057@code{strcat} and @code{strncat}.
6058
6059There are also checking built-in functions for formatted output functions.
6060@smallexample
6061int __builtin___sprintf_chk (char *s, int flag, size_t os, const char *fmt, ...);
6062int __builtin___snprintf_chk (char *s, size_t maxlen, int flag, size_t os,
6ccde948 6063 const char *fmt, ...);
10a0d495 6064int __builtin___vsprintf_chk (char *s, int flag, size_t os, const char *fmt,
6ccde948 6065 va_list ap);
10a0d495 6066int __builtin___vsnprintf_chk (char *s, size_t maxlen, int flag, size_t os,
6ccde948 6067 const char *fmt, va_list ap);
10a0d495
JJ
6068@end smallexample
6069
6070The added @var{flag} argument is passed unchanged to @code{__sprintf_chk}
021efafc 6071etc.@: functions and can contain implementation specific flags on what
10a0d495
JJ
6072additional security measures the checking function might take, such as
6073handling @code{%n} differently.
6074
6075The @var{os} argument is the object size @var{s} points to, like in the
a4d05547 6076other built-in functions. There is a small difference in the behavior
10a0d495
JJ
6077though, if @var{os} is @code{(size_t) -1}, the built-in functions are
6078optimized into the non-checking functions only if @var{flag} is 0, otherwise
6079the checking function is called with @var{os} argument set to
6080@code{(size_t) -1}.
6081
6082In addition to this, there are checking built-in functions
6083@code{__builtin___printf_chk}, @code{__builtin___vprintf_chk},
6084@code{__builtin___fprintf_chk} and @code{__builtin___vfprintf_chk}.
6085These have just one additional argument, @var{flag}, right before
6086format string @var{fmt}. If the compiler is able to optimize them to
021efafc 6087@code{fputc} etc.@: functions, it will, otherwise the checking function
10a0d495
JJ
6088should be called and the @var{flag} argument passed to it.
6089
185ebd6c 6090@node Other Builtins
f0523f02 6091@section Other built-in functions provided by GCC
c771326b 6092@cindex built-in functions
3bf5906b 6093@findex __builtin_fpclassify
0c8d3c2b 6094@findex __builtin_isfinite
8a91c45b 6095@findex __builtin_isnormal
01702459
JM
6096@findex __builtin_isgreater
6097@findex __builtin_isgreaterequal
05f41289 6098@findex __builtin_isinf_sign
01702459
JM
6099@findex __builtin_isless
6100@findex __builtin_islessequal
6101@findex __builtin_islessgreater
6102@findex __builtin_isunordered
17684d46
RG
6103@findex __builtin_powi
6104@findex __builtin_powif
6105@findex __builtin_powil
98ff7c4d
KG
6106@findex _Exit
6107@findex _exit
01702459
JM
6108@findex abort
6109@findex abs
98ff7c4d
KG
6110@findex acos
6111@findex acosf
6112@findex acosh
6113@findex acoshf
6114@findex acoshl
6115@findex acosl
01702459 6116@findex alloca
98ff7c4d
KG
6117@findex asin
6118@findex asinf
6119@findex asinh
6120@findex asinhf
6121@findex asinhl
6122@findex asinl
29f523be 6123@findex atan
46847aa6
RS
6124@findex atan2
6125@findex atan2f
6126@findex atan2l
29f523be 6127@findex atanf
98ff7c4d
KG
6128@findex atanh
6129@findex atanhf
6130@findex atanhl
29f523be 6131@findex atanl
01702459
JM
6132@findex bcmp
6133@findex bzero
075ec276
RS
6134@findex cabs
6135@findex cabsf
6136@findex cabsl
11bf0eb0
KG
6137@findex cacos
6138@findex cacosf
6139@findex cacosh
6140@findex cacoshf
6141@findex cacoshl
6142@findex cacosl
1331d16f 6143@findex calloc
11bf0eb0
KG
6144@findex carg
6145@findex cargf
6146@findex cargl
6147@findex casin
6148@findex casinf
6149@findex casinh
6150@findex casinhf
6151@findex casinhl
6152@findex casinl
6153@findex catan
6154@findex catanf
6155@findex catanh
6156@findex catanhf
6157@findex catanhl
6158@findex catanl
98ff7c4d
KG
6159@findex cbrt
6160@findex cbrtf
6161@findex cbrtl
11bf0eb0
KG
6162@findex ccos
6163@findex ccosf
6164@findex ccosh
6165@findex ccoshf
6166@findex ccoshl
6167@findex ccosl
b052d8ee
RS
6168@findex ceil
6169@findex ceilf
6170@findex ceill
11bf0eb0
KG
6171@findex cexp
6172@findex cexpf
6173@findex cexpl
341e3d11
JM
6174@findex cimag
6175@findex cimagf
6176@findex cimagl
c3887ef2
PC
6177@findex clog
6178@findex clogf
6179@findex clogl
341e3d11
JM
6180@findex conj
6181@findex conjf
6182@findex conjl
98ff7c4d
KG
6183@findex copysign
6184@findex copysignf
6185@findex copysignl
01702459
JM
6186@findex cos
6187@findex cosf
98ff7c4d
KG
6188@findex cosh
6189@findex coshf
6190@findex coshl
01702459 6191@findex cosl
11bf0eb0
KG
6192@findex cpow
6193@findex cpowf
6194@findex cpowl
6195@findex cproj
6196@findex cprojf
6197@findex cprojl
341e3d11
JM
6198@findex creal
6199@findex crealf
6200@findex creall
11bf0eb0
KG
6201@findex csin
6202@findex csinf
6203@findex csinh
6204@findex csinhf
6205@findex csinhl
6206@findex csinl
6207@findex csqrt
6208@findex csqrtf
6209@findex csqrtl
6210@findex ctan
6211@findex ctanf
6212@findex ctanh
6213@findex ctanhf
6214@findex ctanhl
6215@findex ctanl
178b2b9f
RS
6216@findex dcgettext
6217@findex dgettext
98ff7c4d
KG
6218@findex drem
6219@findex dremf
6220@findex dreml
488f17e1
KG
6221@findex erf
6222@findex erfc
6223@findex erfcf
6224@findex erfcl
6225@findex erff
6226@findex erfl
01702459 6227@findex exit
e7b489c8 6228@findex exp
98ff7c4d
KG
6229@findex exp10
6230@findex exp10f
6231@findex exp10l
6232@findex exp2
6233@findex exp2f
6234@findex exp2l
e7b489c8
RS
6235@findex expf
6236@findex expl
98ff7c4d
KG
6237@findex expm1
6238@findex expm1f
6239@findex expm1l
01702459
JM
6240@findex fabs
6241@findex fabsf
6242@findex fabsl
98ff7c4d
KG
6243@findex fdim
6244@findex fdimf
6245@findex fdiml
01702459 6246@findex ffs
b052d8ee
RS
6247@findex floor
6248@findex floorf
6249@findex floorl
98ff7c4d
KG
6250@findex fma
6251@findex fmaf
6252@findex fmal
6253@findex fmax
6254@findex fmaxf
6255@findex fmaxl
6256@findex fmin
6257@findex fminf
6258@findex fminl
b052d8ee
RS
6259@findex fmod
6260@findex fmodf
6261@findex fmodl
18f988a0 6262@findex fprintf
b4c984fb 6263@findex fprintf_unlocked
01702459 6264@findex fputs
b4c984fb 6265@findex fputs_unlocked
a2a919aa
KG
6266@findex frexp
6267@findex frexpf
6268@findex frexpl
178b2b9f 6269@findex fscanf
488f17e1
KG
6270@findex gamma
6271@findex gammaf
6272@findex gammal
bf460eec
KG
6273@findex gamma_r
6274@findex gammaf_r
6275@findex gammal_r
178b2b9f 6276@findex gettext
98ff7c4d
KG
6277@findex hypot
6278@findex hypotf
6279@findex hypotl
6280@findex ilogb
6281@findex ilogbf
6282@findex ilogbl
e78f4a97 6283@findex imaxabs
c7b6c6cd 6284@findex index
740e5b6f
KG
6285@findex isalnum
6286@findex isalpha
6287@findex isascii
6288@findex isblank
6289@findex iscntrl
6290@findex isdigit
6291@findex isgraph
6292@findex islower
6293@findex isprint
6294@findex ispunct
6295@findex isspace
6296@findex isupper
ca4944e1
KG
6297@findex iswalnum
6298@findex iswalpha
6299@findex iswblank
6300@findex iswcntrl
6301@findex iswdigit
6302@findex iswgraph
6303@findex iswlower
6304@findex iswprint
6305@findex iswpunct
6306@findex iswspace
6307@findex iswupper
6308@findex iswxdigit
740e5b6f 6309@findex isxdigit
488f17e1
KG
6310@findex j0
6311@findex j0f
6312@findex j0l
6313@findex j1
6314@findex j1f
6315@findex j1l
6316@findex jn
6317@findex jnf
6318@findex jnl
01702459 6319@findex labs
98ff7c4d
KG
6320@findex ldexp
6321@findex ldexpf
6322@findex ldexpl
488f17e1
KG
6323@findex lgamma
6324@findex lgammaf
6325@findex lgammal
bf460eec
KG
6326@findex lgamma_r
6327@findex lgammaf_r
6328@findex lgammal_r
01702459 6329@findex llabs
98ff7c4d
KG
6330@findex llrint
6331@findex llrintf
6332@findex llrintl
6333@findex llround
6334@findex llroundf
6335@findex llroundl
e7b489c8 6336@findex log
98ff7c4d
KG
6337@findex log10
6338@findex log10f
6339@findex log10l
6340@findex log1p
6341@findex log1pf
6342@findex log1pl
6343@findex log2
6344@findex log2f
6345@findex log2l
6346@findex logb
6347@findex logbf
6348@findex logbl
e7b489c8
RS
6349@findex logf
6350@findex logl
98ff7c4d
KG
6351@findex lrint
6352@findex lrintf
6353@findex lrintl
6354@findex lround
6355@findex lroundf
6356@findex lroundl
1331d16f 6357@findex malloc
2a5fce6d 6358@findex memchr
01702459
JM
6359@findex memcmp
6360@findex memcpy
9cb65f92 6361@findex mempcpy
01702459 6362@findex memset
a2a919aa
KG
6363@findex modf
6364@findex modff
6365@findex modfl
b052d8ee
RS
6366@findex nearbyint
6367@findex nearbyintf
6368@findex nearbyintl
98ff7c4d
KG
6369@findex nextafter
6370@findex nextafterf
6371@findex nextafterl
6372@findex nexttoward
6373@findex nexttowardf
6374@findex nexttowardl
46847aa6 6375@findex pow
98ff7c4d
KG
6376@findex pow10
6377@findex pow10f
6378@findex pow10l
46847aa6
RS
6379@findex powf
6380@findex powl
01702459 6381@findex printf
b4c984fb 6382@findex printf_unlocked
08291658
RS
6383@findex putchar
6384@findex puts
98ff7c4d
KG
6385@findex remainder
6386@findex remainderf
6387@findex remainderl
a2a919aa
KG
6388@findex remquo
6389@findex remquof
6390@findex remquol
c7b6c6cd 6391@findex rindex
98ff7c4d
KG
6392@findex rint
6393@findex rintf
6394@findex rintl
b052d8ee
RS
6395@findex round
6396@findex roundf
6397@findex roundl
98ff7c4d
KG
6398@findex scalb
6399@findex scalbf
6400@findex scalbl
6401@findex scalbln
6402@findex scalblnf
6403@findex scalblnf
6404@findex scalbn
6405@findex scalbnf
6406@findex scanfnl
ef79730c
RS
6407@findex signbit
6408@findex signbitf
6409@findex signbitl
44aea9ac
JJ
6410@findex signbitd32
6411@findex signbitd64
6412@findex signbitd128
488f17e1
KG
6413@findex significand
6414@findex significandf
6415@findex significandl
01702459 6416@findex sin
a2a919aa
KG
6417@findex sincos
6418@findex sincosf
6419@findex sincosl
01702459 6420@findex sinf
98ff7c4d
KG
6421@findex sinh
6422@findex sinhf
6423@findex sinhl
01702459 6424@findex sinl
08291658
RS
6425@findex snprintf
6426@findex sprintf
01702459
JM
6427@findex sqrt
6428@findex sqrtf
6429@findex sqrtl
08291658 6430@findex sscanf
9cb65f92 6431@findex stpcpy
e905ac64
KG
6432@findex stpncpy
6433@findex strcasecmp
d118937d 6434@findex strcat
01702459
JM
6435@findex strchr
6436@findex strcmp
6437@findex strcpy
d118937d 6438@findex strcspn
1331d16f 6439@findex strdup
178b2b9f
RS
6440@findex strfmon
6441@findex strftime
01702459 6442@findex strlen
e905ac64 6443@findex strncasecmp
d118937d 6444@findex strncat
da9e9f08
KG
6445@findex strncmp
6446@findex strncpy
e905ac64 6447@findex strndup
01702459
JM
6448@findex strpbrk
6449@findex strrchr
d118937d 6450@findex strspn
01702459 6451@findex strstr
29f523be
RS
6452@findex tan
6453@findex tanf
98ff7c4d
KG
6454@findex tanh
6455@findex tanhf
6456@findex tanhl
29f523be 6457@findex tanl
488f17e1
KG
6458@findex tgamma
6459@findex tgammaf
6460@findex tgammal
740e5b6f
KG
6461@findex toascii
6462@findex tolower
6463@findex toupper
ca4944e1
KG
6464@findex towlower
6465@findex towupper
4977bab6
ZW
6466@findex trunc
6467@findex truncf
6468@findex truncl
178b2b9f
RS
6469@findex vfprintf
6470@findex vfscanf
08291658
RS
6471@findex vprintf
6472@findex vscanf
6473@findex vsnprintf
6474@findex vsprintf
6475@findex vsscanf
488f17e1
KG
6476@findex y0
6477@findex y0f
6478@findex y0l
6479@findex y1
6480@findex y1f
6481@findex y1l
6482@findex yn
6483@findex ynf
6484@findex ynl
185ebd6c 6485
f0523f02 6486GCC provides a large number of built-in functions other than the ones
185ebd6c
RH
6487mentioned above. Some of these are for internal use in the processing
6488of exceptions or variable-length argument lists and will not be
6489documented here because they may change from time to time; we do not
6490recommend general use of these functions.
6491
6492The remaining functions are provided for optimization purposes.
6493
84330467 6494@opindex fno-builtin
9c34dbbf
ZW
6495GCC includes built-in versions of many of the functions in the standard
6496C library. The versions prefixed with @code{__builtin_} will always be
6497treated as having the same meaning as the C library function even if you
8a36672b 6498specify the @option{-fno-builtin} option. (@pxref{C Dialect Options})
9c34dbbf 6499Many of these functions are only optimized in certain cases; if they are
01702459
JM
6500not optimized in a particular case, a call to the library function will
6501be emitted.
6502
84330467
JM
6503@opindex ansi
6504@opindex std
b052d8ee 6505Outside strict ISO C mode (@option{-ansi}, @option{-std=c89} or
98ff7c4d
KG
6506@option{-std=c99}), the functions
6507@code{_exit}, @code{alloca}, @code{bcmp}, @code{bzero},
6508@code{dcgettext}, @code{dgettext}, @code{dremf}, @code{dreml},
6509@code{drem}, @code{exp10f}, @code{exp10l}, @code{exp10}, @code{ffsll},
bf460eec
KG
6510@code{ffsl}, @code{ffs}, @code{fprintf_unlocked},
6511@code{fputs_unlocked}, @code{gammaf}, @code{gammal}, @code{gamma},
6512@code{gammaf_r}, @code{gammal_r}, @code{gamma_r}, @code{gettext},
740e5b6f
KG
6513@code{index}, @code{isascii}, @code{j0f}, @code{j0l}, @code{j0},
6514@code{j1f}, @code{j1l}, @code{j1}, @code{jnf}, @code{jnl}, @code{jn},
bf460eec
KG
6515@code{lgammaf_r}, @code{lgammal_r}, @code{lgamma_r}, @code{mempcpy},
6516@code{pow10f}, @code{pow10l}, @code{pow10}, @code{printf_unlocked},
6517@code{rindex}, @code{scalbf}, @code{scalbl}, @code{scalb},
6518@code{signbit}, @code{signbitf}, @code{signbitl}, @code{signbitd32},
6519@code{signbitd64}, @code{signbitd128}, @code{significandf},
6520@code{significandl}, @code{significand}, @code{sincosf},
6521@code{sincosl}, @code{sincos}, @code{stpcpy}, @code{stpncpy},
6522@code{strcasecmp}, @code{strdup}, @code{strfmon}, @code{strncasecmp},
6523@code{strndup}, @code{toascii}, @code{y0f}, @code{y0l}, @code{y0},
6524@code{y1f}, @code{y1l}, @code{y1}, @code{ynf}, @code{ynl} and
6525@code{yn}
1331d16f 6526may be handled as built-in functions.
b052d8ee 6527All these functions have corresponding versions
9c34dbbf
ZW
6528prefixed with @code{__builtin_}, which may be used even in strict C89
6529mode.
01702459 6530
075ec276 6531The ISO C99 functions
98ff7c4d
KG
6532@code{_Exit}, @code{acoshf}, @code{acoshl}, @code{acosh}, @code{asinhf},
6533@code{asinhl}, @code{asinh}, @code{atanhf}, @code{atanhl}, @code{atanh},
11bf0eb0
KG
6534@code{cabsf}, @code{cabsl}, @code{cabs}, @code{cacosf}, @code{cacoshf},
6535@code{cacoshl}, @code{cacosh}, @code{cacosl}, @code{cacos},
6536@code{cargf}, @code{cargl}, @code{carg}, @code{casinf}, @code{casinhf},
6537@code{casinhl}, @code{casinh}, @code{casinl}, @code{casin},
6538@code{catanf}, @code{catanhf}, @code{catanhl}, @code{catanh},
6539@code{catanl}, @code{catan}, @code{cbrtf}, @code{cbrtl}, @code{cbrt},
6540@code{ccosf}, @code{ccoshf}, @code{ccoshl}, @code{ccosh}, @code{ccosl},
6541@code{ccos}, @code{cexpf}, @code{cexpl}, @code{cexp}, @code{cimagf},
c3887ef2
PC
6542@code{cimagl}, @code{cimag}, @code{clogf}, @code{clogl}, @code{clog},
6543@code{conjf}, @code{conjl}, @code{conj}, @code{copysignf}, @code{copysignl},
6544@code{copysign}, @code{cpowf}, @code{cpowl}, @code{cpow}, @code{cprojf},
6545@code{cprojl}, @code{cproj}, @code{crealf}, @code{creall}, @code{creal},
6546@code{csinf}, @code{csinhf}, @code{csinhl}, @code{csinh}, @code{csinl},
6547@code{csin}, @code{csqrtf}, @code{csqrtl}, @code{csqrt}, @code{ctanf},
6548@code{ctanhf}, @code{ctanhl}, @code{ctanh}, @code{ctanl}, @code{ctan},
6549@code{erfcf}, @code{erfcl}, @code{erfc}, @code{erff}, @code{erfl},
6550@code{erf}, @code{exp2f}, @code{exp2l}, @code{exp2}, @code{expm1f},
6551@code{expm1l}, @code{expm1}, @code{fdimf}, @code{fdiml}, @code{fdim},
6552@code{fmaf}, @code{fmal}, @code{fmaxf}, @code{fmaxl}, @code{fmax},
6553@code{fma}, @code{fminf}, @code{fminl}, @code{fmin}, @code{hypotf},
6554@code{hypotl}, @code{hypot}, @code{ilogbf}, @code{ilogbl}, @code{ilogb},
6555@code{imaxabs}, @code{isblank}, @code{iswblank}, @code{lgammaf},
6556@code{lgammal}, @code{lgamma}, @code{llabs}, @code{llrintf}, @code{llrintl},
ca4944e1
KG
6557@code{llrint}, @code{llroundf}, @code{llroundl}, @code{llround},
6558@code{log1pf}, @code{log1pl}, @code{log1p}, @code{log2f}, @code{log2l},
6559@code{log2}, @code{logbf}, @code{logbl}, @code{logb}, @code{lrintf},
6560@code{lrintl}, @code{lrint}, @code{lroundf}, @code{lroundl},
6561@code{lround}, @code{nearbyintf}, @code{nearbyintl}, @code{nearbyint},
740e5b6f
KG
6562@code{nextafterf}, @code{nextafterl}, @code{nextafter},
6563@code{nexttowardf}, @code{nexttowardl}, @code{nexttoward},
6564@code{remainderf}, @code{remainderl}, @code{remainder}, @code{remquof},
6565@code{remquol}, @code{remquo}, @code{rintf}, @code{rintl}, @code{rint},
6566@code{roundf}, @code{roundl}, @code{round}, @code{scalblnf},
6567@code{scalblnl}, @code{scalbln}, @code{scalbnf}, @code{scalbnl},
6568@code{scalbn}, @code{snprintf}, @code{tgammaf}, @code{tgammal},
6569@code{tgamma}, @code{truncf}, @code{truncl}, @code{trunc},
6570@code{vfscanf}, @code{vscanf}, @code{vsnprintf} and @code{vsscanf}
08291658 6571are handled as built-in functions
b052d8ee 6572except in strict ISO C90 mode (@option{-ansi} or @option{-std=c89}).
46847aa6 6573
98ff7c4d
KG
6574There are also built-in versions of the ISO C99 functions
6575@code{acosf}, @code{acosl}, @code{asinf}, @code{asinl}, @code{atan2f},
29f523be 6576@code{atan2l}, @code{atanf}, @code{atanl}, @code{ceilf}, @code{ceill},
98ff7c4d
KG
6577@code{cosf}, @code{coshf}, @code{coshl}, @code{cosl}, @code{expf},
6578@code{expl}, @code{fabsf}, @code{fabsl}, @code{floorf}, @code{floorl},
a2a919aa
KG
6579@code{fmodf}, @code{fmodl}, @code{frexpf}, @code{frexpl}, @code{ldexpf},
6580@code{ldexpl}, @code{log10f}, @code{log10l}, @code{logf}, @code{logl},
6581@code{modfl}, @code{modf}, @code{powf}, @code{powl}, @code{sinf},
6582@code{sinhf}, @code{sinhl}, @code{sinl}, @code{sqrtf}, @code{sqrtl},
6583@code{tanf}, @code{tanhf}, @code{tanhl} and @code{tanl}
46847aa6
RS
6584that are recognized in any mode since ISO C90 reserves these names for
6585the purpose to which ISO C99 puts them. All these functions have
6586corresponding versions prefixed with @code{__builtin_}.
6587
ca4944e1
KG
6588The ISO C94 functions
6589@code{iswalnum}, @code{iswalpha}, @code{iswcntrl}, @code{iswdigit},
6590@code{iswgraph}, @code{iswlower}, @code{iswprint}, @code{iswpunct},
6591@code{iswspace}, @code{iswupper}, @code{iswxdigit}, @code{towlower} and
6592@code{towupper}
6593are handled as built-in functions
6594except in strict ISO C90 mode (@option{-ansi} or @option{-std=c89}).
6595
98ff7c4d
KG
6596The ISO C90 functions
6597@code{abort}, @code{abs}, @code{acos}, @code{asin}, @code{atan2},
6598@code{atan}, @code{calloc}, @code{ceil}, @code{cosh}, @code{cos},
6599@code{exit}, @code{exp}, @code{fabs}, @code{floor}, @code{fmod},
740e5b6f
KG
6600@code{fprintf}, @code{fputs}, @code{frexp}, @code{fscanf},
6601@code{isalnum}, @code{isalpha}, @code{iscntrl}, @code{isdigit},
6602@code{isgraph}, @code{islower}, @code{isprint}, @code{ispunct},
6603@code{isspace}, @code{isupper}, @code{isxdigit}, @code{tolower},
6604@code{toupper}, @code{labs}, @code{ldexp}, @code{log10}, @code{log},
2a5fce6d
PC
6605@code{malloc}, @code{memchr}, @code{memcmp}, @code{memcpy},
6606@code{memset}, @code{modf}, @code{pow}, @code{printf}, @code{putchar},
6607@code{puts}, @code{scanf}, @code{sinh}, @code{sin}, @code{snprintf},
6608@code{sprintf}, @code{sqrt}, @code{sscanf}, @code{strcat},
6609@code{strchr}, @code{strcmp}, @code{strcpy}, @code{strcspn},
6610@code{strlen}, @code{strncat}, @code{strncmp}, @code{strncpy},
6611@code{strpbrk}, @code{strrchr}, @code{strspn}, @code{strstr},
6612@code{tanh}, @code{tan}, @code{vfprintf}, @code{vprintf} and @code{vsprintf}
08291658 6613are all recognized as built-in functions unless
46847aa6
RS
6614@option{-fno-builtin} is specified (or @option{-fno-builtin-@var{function}}
6615is specified for an individual function). All of these functions have
4977bab6 6616corresponding versions prefixed with @code{__builtin_}.
9c34dbbf
ZW
6617
6618GCC provides built-in versions of the ISO C99 floating point comparison
6619macros that avoid raising exceptions for unordered operands. They have
6620the same names as the standard macros ( @code{isgreater},
6621@code{isgreaterequal}, @code{isless}, @code{islessequal},
6622@code{islessgreater}, and @code{isunordered}) , with @code{__builtin_}
6623prefixed. We intend for a library implementor to be able to simply
6624@code{#define} each standard macro to its built-in equivalent.
3bf5906b
KG
6625In the same fashion, GCC provides @code{fpclassify}, @code{isfinite},
6626@code{isinf_sign} and @code{isnormal} built-ins used with
6627@code{__builtin_} prefixed. The @code{isinf} and @code{isnan}
6628builtins appear both with and without the @code{__builtin_} prefix.
185ebd6c 6629
ecbcf7b3
AH
6630@deftypefn {Built-in Function} int __builtin_types_compatible_p (@var{type1}, @var{type2})
6631
6632You can use the built-in function @code{__builtin_types_compatible_p} to
6633determine whether two types are the same.
6634
6635This built-in function returns 1 if the unqualified versions of the
6636types @var{type1} and @var{type2} (which are types, not expressions) are
6637compatible, 0 otherwise. The result of this built-in function can be
6638used in integer constant expressions.
6639
6640This built-in function ignores top level qualifiers (e.g., @code{const},
6641@code{volatile}). For example, @code{int} is equivalent to @code{const
6642int}.
6643
6644The type @code{int[]} and @code{int[5]} are compatible. On the other
6645hand, @code{int} and @code{char *} are not compatible, even if the size
6646of their types, on the particular architecture are the same. Also, the
6647amount of pointer indirection is taken into account when determining
6648similarity. Consequently, @code{short *} is not similar to
6649@code{short **}. Furthermore, two types that are typedefed are
6650considered compatible if their underlying types are compatible.
6651
bca63328
JM
6652An @code{enum} type is not considered to be compatible with another
6653@code{enum} type even if both are compatible with the same integer
6654type; this is what the C standard specifies.
6655For example, @code{enum @{foo, bar@}} is not similar to
ecbcf7b3
AH
6656@code{enum @{hot, dog@}}.
6657
6658You would typically use this function in code whose execution varies
6659depending on the arguments' types. For example:
6660
6661@smallexample
6e5bb5ad
JM
6662#define foo(x) \
6663 (@{ \
b7886f14 6664 typeof (x) tmp = (x); \
6e5bb5ad
JM
6665 if (__builtin_types_compatible_p (typeof (x), long double)) \
6666 tmp = foo_long_double (tmp); \
6667 else if (__builtin_types_compatible_p (typeof (x), double)) \
6668 tmp = foo_double (tmp); \
6669 else if (__builtin_types_compatible_p (typeof (x), float)) \
6670 tmp = foo_float (tmp); \
6671 else \
6672 abort (); \
6673 tmp; \
ecbcf7b3
AH
6674 @})
6675@end smallexample
6676
8a36672b 6677@emph{Note:} This construct is only available for C@.
ecbcf7b3
AH
6678
6679@end deftypefn
6680
6681@deftypefn {Built-in Function} @var{type} __builtin_choose_expr (@var{const_exp}, @var{exp1}, @var{exp2})
6682
6683You can use the built-in function @code{__builtin_choose_expr} to
6684evaluate code depending on the value of a constant expression. This
928c19bb
JM
6685built-in function returns @var{exp1} if @var{const_exp}, which is an
6686integer constant expression, is nonzero. Otherwise it returns 0.
ecbcf7b3
AH
6687
6688This built-in function is analogous to the @samp{? :} operator in C,
6689except that the expression returned has its type unaltered by promotion
6690rules. Also, the built-in function does not evaluate the expression
6691that was not chosen. For example, if @var{const_exp} evaluates to true,
6692@var{exp2} is not evaluated even if it has side-effects.
6693
6694This built-in function can return an lvalue if the chosen argument is an
6695lvalue.
6696
6697If @var{exp1} is returned, the return type is the same as @var{exp1}'s
6698type. Similarly, if @var{exp2} is returned, its return type is the same
6699as @var{exp2}.
6700
6701Example:
6702
6703@smallexample
478c9e72
JJ
6704#define foo(x) \
6705 __builtin_choose_expr ( \
6706 __builtin_types_compatible_p (typeof (x), double), \
6707 foo_double (x), \
6708 __builtin_choose_expr ( \
6709 __builtin_types_compatible_p (typeof (x), float), \
6710 foo_float (x), \
6711 /* @r{The void expression results in a compile-time error} \
6712 @r{when assigning the result to something.} */ \
ecbcf7b3
AH
6713 (void)0))
6714@end smallexample
6715
8a36672b 6716@emph{Note:} This construct is only available for C@. Furthermore, the
ecbcf7b3
AH
6717unused expression (@var{exp1} or @var{exp2} depending on the value of
6718@var{const_exp}) may still generate syntax errors. This may change in
6719future revisions.
6720
6721@end deftypefn
6722
84330467
JM
6723@deftypefn {Built-in Function} int __builtin_constant_p (@var{exp})
6724You can use the built-in function @code{__builtin_constant_p} to
185ebd6c 6725determine if a value is known to be constant at compile-time and hence
f0523f02 6726that GCC can perform constant-folding on expressions involving that
185ebd6c
RH
6727value. The argument of the function is the value to test. The function
6728returns the integer 1 if the argument is known to be a compile-time
6729constant and 0 if it is not known to be a compile-time constant. A
6730return of 0 does not indicate that the value is @emph{not} a constant,
f0523f02 6731but merely that GCC cannot prove it is a constant with the specified
84330467 6732value of the @option{-O} option.
185ebd6c
RH
6733
6734You would typically use this function in an embedded application where
6735memory was a critical resource. If you have some complex calculation,
6736you may want it to be folded if it involves constants, but need to call
6737a function if it does not. For example:
6738
4d390518 6739@smallexample
310668e8
JM
6740#define Scale_Value(X) \
6741 (__builtin_constant_p (X) \
6742 ? ((X) * SCALE + OFFSET) : Scale (X))
185ebd6c
RH
6743@end smallexample
6744
84330467 6745You may use this built-in function in either a macro or an inline
185ebd6c 6746function. However, if you use it in an inlined function and pass an
f0523f02 6747argument of the function as the argument to the built-in, GCC will
185ebd6c 6748never return 1 when you call the inline function with a string constant
4b404517 6749or compound literal (@pxref{Compound Literals}) and will not return 1
185ebd6c 6750when you pass a constant numeric value to the inline function unless you
84330467 6751specify the @option{-O} option.
13104975
ZW
6752
6753You may also use @code{__builtin_constant_p} in initializers for static
6754data. For instance, you can write
6755
6756@smallexample
79323c50 6757static const int table[] = @{
13104975 6758 __builtin_constant_p (EXPRESSION) ? (EXPRESSION) : -1,
0d893a63 6759 /* @r{@dots{}} */
79323c50 6760@};
13104975
ZW
6761@end smallexample
6762
6763@noindent
6764This is an acceptable initializer even if @var{EXPRESSION} is not a
928c19bb
JM
6765constant expression, including the case where
6766@code{__builtin_constant_p} returns 1 because @var{EXPRESSION} can be
6767folded to a constant but @var{EXPRESSION} contains operands that would
c782f1dd 6768not otherwise be permitted in a static initializer (for example,
928c19bb 6769@code{0 && foo ()}). GCC must be more conservative about evaluating the
13104975
ZW
6770built-in in this case, because it has no opportunity to perform
6771optimization.
6772
6773Previous versions of GCC did not accept this built-in in data
6774initializers. The earliest version where it is completely safe is
67753.0.1.
84330467 6776@end deftypefn
185ebd6c 6777
84330467
JM
6778@deftypefn {Built-in Function} long __builtin_expect (long @var{exp}, long @var{c})
6779@opindex fprofile-arcs
02f52e19 6780You may use @code{__builtin_expect} to provide the compiler with
994a57cd 6781branch prediction information. In general, you should prefer to
84330467 6782use actual profile feedback for this (@option{-fprofile-arcs}), as
994a57cd 6783programmers are notoriously bad at predicting how their programs
60b6e1f5 6784actually perform. However, there are applications in which this
994a57cd
RH
6785data is hard to collect.
6786
ef950eba
JH
6787The return value is the value of @var{exp}, which should be an integral
6788expression. The semantics of the built-in are that it is expected that
6789@var{exp} == @var{c}. For example:
994a57cd
RH
6790
6791@smallexample
6792if (__builtin_expect (x, 0))
6793 foo ();
6794@end smallexample
6795
6796@noindent
6797would indicate that we do not expect to call @code{foo}, since
6798we expect @code{x} to be zero. Since you are limited to integral
6799expressions for @var{exp}, you should use constructions such as
6800
6801@smallexample
6802if (__builtin_expect (ptr != NULL, 1))
6803 error ();
6804@end smallexample
6805
6806@noindent
6807when testing pointer or floating-point values.
84330467 6808@end deftypefn
994a57cd 6809
a18c20ec
AP
6810@deftypefn {Built-in Function} void __builtin_trap (void)
6811This function causes the program to exit abnormally. GCC implements
6812this function by using a target-dependent mechanism (such as
6813intentionally executing an illegal instruction) or by calling
6814@code{abort}. The mechanism used may vary from release to release so
6815you should not rely on any particular implementation.
6816@end deftypefn
6817
677feb77
DD
6818@deftypefn {Built-in Function} void __builtin___clear_cache (char *@var{begin}, char *@var{end})
6819This function is used to flush the processor's instruction cache for
6820the region of memory between @var{begin} inclusive and @var{end}
6821exclusive. Some targets require that the instruction cache be
6822flushed, after modifying memory containing code, in order to obtain
6823deterministic behavior.
6824
6825If the target does not require instruction cache flushes,
6826@code{__builtin___clear_cache} has no effect. Otherwise either
6827instructions are emitted in-line to clear the instruction cache or a
6828call to the @code{__clear_cache} function in libgcc is made.
6829@end deftypefn
6830
3bca17dd 6831@deftypefn {Built-in Function} void __builtin_prefetch (const void *@var{addr}, ...)
a9ccbb60
JJ
6832This function is used to minimize cache-miss latency by moving data into
6833a cache before it is accessed.
6834You can insert calls to @code{__builtin_prefetch} into code for which
6835you know addresses of data in memory that is likely to be accessed soon.
6836If the target supports them, data prefetch instructions will be generated.
6837If the prefetch is done early enough before the access then the data will
6838be in the cache by the time it is accessed.
6839
6840The value of @var{addr} is the address of the memory to prefetch.
e83d297b 6841There are two optional arguments, @var{rw} and @var{locality}.
a9ccbb60 6842The value of @var{rw} is a compile-time constant one or zero; one
e83d297b
JJ
6843means that the prefetch is preparing for a write to the memory address
6844and zero, the default, means that the prefetch is preparing for a read.
a9ccbb60
JJ
6845The value @var{locality} must be a compile-time constant integer between
6846zero and three. A value of zero means that the data has no temporal
6847locality, so it need not be left in the cache after the access. A value
6848of three means that the data has a high degree of temporal locality and
6849should be left in all levels of cache possible. Values of one and two
e83d297b
JJ
6850mean, respectively, a low or moderate degree of temporal locality. The
6851default is three.
a9ccbb60
JJ
6852
6853@smallexample
6854for (i = 0; i < n; i++)
6855 @{
6856 a[i] = a[i] + b[i];
6857 __builtin_prefetch (&a[i+j], 1, 1);
6858 __builtin_prefetch (&b[i+j], 0, 1);
0d893a63 6859 /* @r{@dots{}} */
a9ccbb60
JJ
6860 @}
6861@end smallexample
6862
f282ffb3 6863Data prefetch does not generate faults if @var{addr} is invalid, but
a9ccbb60
JJ
6864the address expression itself must be valid. For example, a prefetch
6865of @code{p->next} will not fault if @code{p->next} is not a valid
6866address, but evaluation will fault if @code{p} is not a valid address.
6867
6868If the target does not support data prefetch, the address expression
6869is evaluated if it includes side effects but no other code is generated
6870and GCC does not issue a warning.
6871@end deftypefn
6872
ab5e2615
RH
6873@deftypefn {Built-in Function} double __builtin_huge_val (void)
6874Returns a positive infinity, if supported by the floating-point format,
6875else @code{DBL_MAX}. This function is suitable for implementing the
6876ISO C macro @code{HUGE_VAL}.
6877@end deftypefn
6878
6879@deftypefn {Built-in Function} float __builtin_huge_valf (void)
6880Similar to @code{__builtin_huge_val}, except the return type is @code{float}.
6881@end deftypefn
6882
dad78426 6883@deftypefn {Built-in Function} {long double} __builtin_huge_vall (void)
ab5e2615
RH
6884Similar to @code{__builtin_huge_val}, except the return
6885type is @code{long double}.
6886@end deftypefn
6887
3bf5906b
KG
6888@deftypefn {Built-in Function} int __builtin_fpclassify (int, int, int, int, int, ...)
6889This built-in implements the C99 fpclassify functionality. The first
6890five int arguments should be the target library's notion of the
6891possible FP classes and are used for return values. They must be
6892constant values and they must appear in this order: @code{FP_NAN},
32101f99 6893@code{FP_INFINITE}, @code{FP_NORMAL}, @code{FP_SUBNORMAL} and
3bf5906b
KG
6894@code{FP_ZERO}. The ellipsis is for exactly one floating point value
6895to classify. GCC treats the last argument as type-generic, which
6896means it does not do default promotion from float to double.
6897@end deftypefn
6898
ab5e2615
RH
6899@deftypefn {Built-in Function} double __builtin_inf (void)
6900Similar to @code{__builtin_huge_val}, except a warning is generated
6901if the target floating-point format does not support infinities.
ab5e2615
RH
6902@end deftypefn
6903
9a8ce21f
JG
6904@deftypefn {Built-in Function} _Decimal32 __builtin_infd32 (void)
6905Similar to @code{__builtin_inf}, except the return type is @code{_Decimal32}.
6906@end deftypefn
6907
6908@deftypefn {Built-in Function} _Decimal64 __builtin_infd64 (void)
6909Similar to @code{__builtin_inf}, except the return type is @code{_Decimal64}.
6910@end deftypefn
6911
6912@deftypefn {Built-in Function} _Decimal128 __builtin_infd128 (void)
6913Similar to @code{__builtin_inf}, except the return type is @code{_Decimal128}.
6914@end deftypefn
6915
ab5e2615
RH
6916@deftypefn {Built-in Function} float __builtin_inff (void)
6917Similar to @code{__builtin_inf}, except the return type is @code{float}.
9c86fc0b 6918This function is suitable for implementing the ISO C99 macro @code{INFINITY}.
ab5e2615
RH
6919@end deftypefn
6920
dad78426 6921@deftypefn {Built-in Function} {long double} __builtin_infl (void)
ab5e2615
RH
6922Similar to @code{__builtin_inf}, except the return
6923type is @code{long double}.
6924@end deftypefn
6925
05f41289
KG
6926@deftypefn {Built-in Function} int __builtin_isinf_sign (...)
6927Similar to @code{isinf}, except the return value will be negative for
6928an argument of @code{-Inf}. Note while the parameter list is an
6929ellipsis, this function only accepts exactly one floating point
6930argument. GCC treats this parameter as type-generic, which means it
6931does not do default promotion from float to double.
6932@end deftypefn
6933
1472e41c
RH
6934@deftypefn {Built-in Function} double __builtin_nan (const char *str)
6935This is an implementation of the ISO C99 function @code{nan}.
6936
6937Since ISO C99 defines this function in terms of @code{strtod}, which we
c0478a66 6938do not implement, a description of the parsing is in order. The string
1472e41c
RH
6939is parsed as by @code{strtol}; that is, the base is recognized by
6940leading @samp{0} or @samp{0x} prefixes. The number parsed is placed
6941in the significand such that the least significant bit of the number
daf2f129 6942is at the least significant bit of the significand. The number is
1472e41c 6943truncated to fit the significand field provided. The significand is
8a36672b 6944forced to be a quiet NaN@.
1472e41c 6945
a7d37464
GK
6946This function, if given a string literal all of which would have been
6947consumed by strtol, is evaluated early enough that it is considered a
6948compile-time constant.
1472e41c
RH
6949@end deftypefn
6950
9a8ce21f
JG
6951@deftypefn {Built-in Function} _Decimal32 __builtin_nand32 (const char *str)
6952Similar to @code{__builtin_nan}, except the return type is @code{_Decimal32}.
6953@end deftypefn
6954
6955@deftypefn {Built-in Function} _Decimal64 __builtin_nand64 (const char *str)
6956Similar to @code{__builtin_nan}, except the return type is @code{_Decimal64}.
6957@end deftypefn
6958
6959@deftypefn {Built-in Function} _Decimal128 __builtin_nand128 (const char *str)
6960Similar to @code{__builtin_nan}, except the return type is @code{_Decimal128}.
6961@end deftypefn
6962
1472e41c
RH
6963@deftypefn {Built-in Function} float __builtin_nanf (const char *str)
6964Similar to @code{__builtin_nan}, except the return type is @code{float}.
6965@end deftypefn
6966
dad78426 6967@deftypefn {Built-in Function} {long double} __builtin_nanl (const char *str)
1472e41c
RH
6968Similar to @code{__builtin_nan}, except the return type is @code{long double}.
6969@end deftypefn
6970
6971@deftypefn {Built-in Function} double __builtin_nans (const char *str)
daf2f129 6972Similar to @code{__builtin_nan}, except the significand is forced
8a36672b 6973to be a signaling NaN@. The @code{nans} function is proposed by
aaa67502 6974@uref{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n965.htm,,WG14 N965}.
1472e41c
RH
6975@end deftypefn
6976
6977@deftypefn {Built-in Function} float __builtin_nansf (const char *str)
6978Similar to @code{__builtin_nans}, except the return type is @code{float}.
6979@end deftypefn
6980
dad78426 6981@deftypefn {Built-in Function} {long double} __builtin_nansl (const char *str)
1472e41c
RH
6982Similar to @code{__builtin_nans}, except the return type is @code{long double}.
6983@end deftypefn
6984
2928cd7a
RH
6985@deftypefn {Built-in Function} int __builtin_ffs (unsigned int x)
6986Returns one plus the index of the least significant 1-bit of @var{x}, or
6987if @var{x} is zero, returns zero.
6988@end deftypefn
6989
6990@deftypefn {Built-in Function} int __builtin_clz (unsigned int x)
6991Returns the number of leading 0-bits in @var{x}, starting at the most
6992significant bit position. If @var{x} is 0, the result is undefined.
6993@end deftypefn
6994
6995@deftypefn {Built-in Function} int __builtin_ctz (unsigned int x)
6996Returns the number of trailing 0-bits in @var{x}, starting at the least
6997significant bit position. If @var{x} is 0, the result is undefined.
6998@end deftypefn
6999
7000@deftypefn {Built-in Function} int __builtin_popcount (unsigned int x)
7001Returns the number of 1-bits in @var{x}.
7002@end deftypefn
7003
7004@deftypefn {Built-in Function} int __builtin_parity (unsigned int x)
8a36672b 7005Returns the parity of @var{x}, i.e.@: the number of 1-bits in @var{x}
2928cd7a
RH
7006modulo 2.
7007@end deftypefn
7008
7009@deftypefn {Built-in Function} int __builtin_ffsl (unsigned long)
7010Similar to @code{__builtin_ffs}, except the argument type is
7011@code{unsigned long}.
7012@end deftypefn
7013
7014@deftypefn {Built-in Function} int __builtin_clzl (unsigned long)
7015Similar to @code{__builtin_clz}, except the argument type is
7016@code{unsigned long}.
7017@end deftypefn
7018
7019@deftypefn {Built-in Function} int __builtin_ctzl (unsigned long)
7020Similar to @code{__builtin_ctz}, except the argument type is
7021@code{unsigned long}.
7022@end deftypefn
7023
7024@deftypefn {Built-in Function} int __builtin_popcountl (unsigned long)
7025Similar to @code{__builtin_popcount}, except the argument type is
7026@code{unsigned long}.
7027@end deftypefn
7028
7029@deftypefn {Built-in Function} int __builtin_parityl (unsigned long)
7030Similar to @code{__builtin_parity}, except the argument type is
7031@code{unsigned long}.
7032@end deftypefn
7033
7034@deftypefn {Built-in Function} int __builtin_ffsll (unsigned long long)
7035Similar to @code{__builtin_ffs}, except the argument type is
7036@code{unsigned long long}.
7037@end deftypefn
7038
7039@deftypefn {Built-in Function} int __builtin_clzll (unsigned long long)
7040Similar to @code{__builtin_clz}, except the argument type is
7041@code{unsigned long long}.
7042@end deftypefn
7043
7044@deftypefn {Built-in Function} int __builtin_ctzll (unsigned long long)
7045Similar to @code{__builtin_ctz}, except the argument type is
7046@code{unsigned long long}.
7047@end deftypefn
7048
7049@deftypefn {Built-in Function} int __builtin_popcountll (unsigned long long)
7050Similar to @code{__builtin_popcount}, except the argument type is
7051@code{unsigned long long}.
7052@end deftypefn
7053
7054@deftypefn {Built-in Function} int __builtin_parityll (unsigned long long)
7055Similar to @code{__builtin_parity}, except the argument type is
7056@code{unsigned long long}.
7057@end deftypefn
7058
17684d46
RG
7059@deftypefn {Built-in Function} double __builtin_powi (double, int)
7060Returns the first argument raised to the power of the second. Unlike the
7061@code{pow} function no guarantees about precision and rounding are made.
7062@end deftypefn
7063
7064@deftypefn {Built-in Function} float __builtin_powif (float, int)
7065Similar to @code{__builtin_powi}, except the argument and return types
7066are @code{float}.
7067@end deftypefn
7068
7069@deftypefn {Built-in Function} {long double} __builtin_powil (long double, int)
7070Similar to @code{__builtin_powi}, except the argument and return types
7071are @code{long double}.
7072@end deftypefn
7073
167fa32c
EC
7074@deftypefn {Built-in Function} int32_t __builtin_bswap32 (int32_t x)
7075Returns @var{x} with the order of the bytes reversed; for example,
7076@code{0xaabbccdd} becomes @code{0xddccbbaa}. Byte here always means
7077exactly 8 bits.
7078@end deftypefn
7079
7080@deftypefn {Built-in Function} int64_t __builtin_bswap64 (int64_t x)
7081Similar to @code{__builtin_bswap32}, except the argument and return types
7082are 64-bit.
7083@end deftypefn
2928cd7a 7084
0975678f
JM
7085@node Target Builtins
7086@section Built-in Functions Specific to Particular Target Machines
7087
7088On some target machines, GCC supports many built-in functions specific
7089to those machines. Generally these generate calls to specific machine
7090instructions, but allow the compiler to schedule those calls.
7091
7092@menu
6d8fd7bb 7093* Alpha Built-in Functions::
88f77cba
JB
7094* ARM iWMMXt Built-in Functions::
7095* ARM NEON Intrinsics::
161c21b6 7096* Blackfin Built-in Functions::
c3ee0579 7097* FR-V Built-in Functions::
0975678f 7098* X86 Built-in Functions::
118ea793 7099* MIPS DSP Built-in Functions::
d840bfd3 7100* MIPS Paired-Single Support::
93581857 7101* MIPS Loongson Built-in Functions::
4d210b07 7102* Other MIPS Built-in Functions::
358da97e 7103* picoChip Built-in Functions::
333c8841 7104* PowerPC AltiVec Built-in Functions::
c5145ceb 7105* SPARC VIS Built-in Functions::
85d9c13c 7106* SPU Built-in Functions::
0975678f
JM
7107@end menu
7108
6d8fd7bb
RH
7109@node Alpha Built-in Functions
7110@subsection Alpha Built-in Functions
7111
7112These built-in functions are available for the Alpha family of
7113processors, depending on the command-line switches used.
7114
95b1627e 7115The following built-in functions are always available. They
6d8fd7bb
RH
7116all generate the machine instruction that is part of the name.
7117
3ab51846 7118@smallexample
6d8fd7bb
RH
7119long __builtin_alpha_implver (void)
7120long __builtin_alpha_rpcc (void)
7121long __builtin_alpha_amask (long)
7122long __builtin_alpha_cmpbge (long, long)
c4b50f1a
RH
7123long __builtin_alpha_extbl (long, long)
7124long __builtin_alpha_extwl (long, long)
7125long __builtin_alpha_extll (long, long)
6d8fd7bb 7126long __builtin_alpha_extql (long, long)
c4b50f1a
RH
7127long __builtin_alpha_extwh (long, long)
7128long __builtin_alpha_extlh (long, long)
6d8fd7bb 7129long __builtin_alpha_extqh (long, long)
c4b50f1a
RH
7130long __builtin_alpha_insbl (long, long)
7131long __builtin_alpha_inswl (long, long)
7132long __builtin_alpha_insll (long, long)
7133long __builtin_alpha_insql (long, long)
7134long __builtin_alpha_inswh (long, long)
7135long __builtin_alpha_inslh (long, long)
7136long __builtin_alpha_insqh (long, long)
7137long __builtin_alpha_mskbl (long, long)
7138long __builtin_alpha_mskwl (long, long)
7139long __builtin_alpha_mskll (long, long)
7140long __builtin_alpha_mskql (long, long)
7141long __builtin_alpha_mskwh (long, long)
7142long __builtin_alpha_msklh (long, long)
7143long __builtin_alpha_mskqh (long, long)
7144long __builtin_alpha_umulh (long, long)
6d8fd7bb
RH
7145long __builtin_alpha_zap (long, long)
7146long __builtin_alpha_zapnot (long, long)
3ab51846 7147@end smallexample
6d8fd7bb
RH
7148
7149The following built-in functions are always with @option{-mmax}
7150or @option{-mcpu=@var{cpu}} where @var{cpu} is @code{pca56} or
7151later. They all generate the machine instruction that is part
7152of the name.
7153
3ab51846 7154@smallexample
6d8fd7bb
RH
7155long __builtin_alpha_pklb (long)
7156long __builtin_alpha_pkwb (long)
7157long __builtin_alpha_unpkbl (long)
7158long __builtin_alpha_unpkbw (long)
7159long __builtin_alpha_minub8 (long, long)
7160long __builtin_alpha_minsb8 (long, long)
7161long __builtin_alpha_minuw4 (long, long)
7162long __builtin_alpha_minsw4 (long, long)
7163long __builtin_alpha_maxub8 (long, long)
7164long __builtin_alpha_maxsb8 (long, long)
7165long __builtin_alpha_maxuw4 (long, long)
7166long __builtin_alpha_maxsw4 (long, long)
7167long __builtin_alpha_perr (long, long)
3ab51846 7168@end smallexample
6d8fd7bb 7169
c4b50f1a
RH
7170The following built-in functions are always with @option{-mcix}
7171or @option{-mcpu=@var{cpu}} where @var{cpu} is @code{ev67} or
7172later. They all generate the machine instruction that is part
7173of the name.
7174
3ab51846 7175@smallexample
c4b50f1a
RH
7176long __builtin_alpha_cttz (long)
7177long __builtin_alpha_ctlz (long)
7178long __builtin_alpha_ctpop (long)
3ab51846 7179@end smallexample
c4b50f1a 7180
116b7a5e
RH
7181The following builtins are available on systems that use the OSF/1
7182PALcode. Normally they invoke the @code{rduniq} and @code{wruniq}
7183PAL calls, but when invoked with @option{-mtls-kernel}, they invoke
7184@code{rdval} and @code{wrval}.
7185
3ab51846 7186@smallexample
116b7a5e
RH
7187void *__builtin_thread_pointer (void)
7188void __builtin_set_thread_pointer (void *)
3ab51846 7189@end smallexample
116b7a5e 7190
88f77cba
JB
7191@node ARM iWMMXt Built-in Functions
7192@subsection ARM iWMMXt Built-in Functions
4bc73018
NC
7193
7194These built-in functions are available for the ARM family of
88f77cba 7195processors when the @option{-mcpu=iwmmxt} switch is used:
4bc73018 7196
3ab51846 7197@smallexample
d63851eb
ILT
7198typedef int v2si __attribute__ ((vector_size (8)));
7199typedef short v4hi __attribute__ ((vector_size (8)));
7200typedef char v8qi __attribute__ ((vector_size (8)));
7201
7202int __builtin_arm_getwcx (int)
7203void __builtin_arm_setwcx (int, int)
7204int __builtin_arm_textrmsb (v8qi, int)
7205int __builtin_arm_textrmsh (v4hi, int)
7206int __builtin_arm_textrmsw (v2si, int)
7207int __builtin_arm_textrmub (v8qi, int)
7208int __builtin_arm_textrmuh (v4hi, int)
7209int __builtin_arm_textrmuw (v2si, int)
7210v8qi __builtin_arm_tinsrb (v8qi, int)
7211v4hi __builtin_arm_tinsrh (v4hi, int)
7212v2si __builtin_arm_tinsrw (v2si, int)
7213long long __builtin_arm_tmia (long long, int, int)
7214long long __builtin_arm_tmiabb (long long, int, int)
7215long long __builtin_arm_tmiabt (long long, int, int)
7216long long __builtin_arm_tmiaph (long long, int, int)
7217long long __builtin_arm_tmiatb (long long, int, int)
7218long long __builtin_arm_tmiatt (long long, int, int)
7219int __builtin_arm_tmovmskb (v8qi)
7220int __builtin_arm_tmovmskh (v4hi)
7221int __builtin_arm_tmovmskw (v2si)
7222long long __builtin_arm_waccb (v8qi)
7223long long __builtin_arm_wacch (v4hi)
7224long long __builtin_arm_waccw (v2si)
7225v8qi __builtin_arm_waddb (v8qi, v8qi)
7226v8qi __builtin_arm_waddbss (v8qi, v8qi)
7227v8qi __builtin_arm_waddbus (v8qi, v8qi)
7228v4hi __builtin_arm_waddh (v4hi, v4hi)
7229v4hi __builtin_arm_waddhss (v4hi, v4hi)
7230v4hi __builtin_arm_waddhus (v4hi, v4hi)
4bc73018 7231v2si __builtin_arm_waddw (v2si, v2si)
4bc73018 7232v2si __builtin_arm_waddwss (v2si, v2si)
4bc73018 7233v2si __builtin_arm_waddwus (v2si, v2si)
d63851eb
ILT
7234v8qi __builtin_arm_walign (v8qi, v8qi, int)
7235long long __builtin_arm_wand(long long, long long)
7236long long __builtin_arm_wandn (long long, long long)
7237v8qi __builtin_arm_wavg2b (v8qi, v8qi)
7238v8qi __builtin_arm_wavg2br (v8qi, v8qi)
7239v4hi __builtin_arm_wavg2h (v4hi, v4hi)
7240v4hi __builtin_arm_wavg2hr (v4hi, v4hi)
7241v8qi __builtin_arm_wcmpeqb (v8qi, v8qi)
7242v4hi __builtin_arm_wcmpeqh (v4hi, v4hi)
4bc73018 7243v2si __builtin_arm_wcmpeqw (v2si, v2si)
d63851eb
ILT
7244v8qi __builtin_arm_wcmpgtsb (v8qi, v8qi)
7245v4hi __builtin_arm_wcmpgtsh (v4hi, v4hi)
4bc73018 7246v2si __builtin_arm_wcmpgtsw (v2si, v2si)
d63851eb
ILT
7247v8qi __builtin_arm_wcmpgtub (v8qi, v8qi)
7248v4hi __builtin_arm_wcmpgtuh (v4hi, v4hi)
7249v2si __builtin_arm_wcmpgtuw (v2si, v2si)
7250long long __builtin_arm_wmacs (long long, v4hi, v4hi)
7251long long __builtin_arm_wmacsz (v4hi, v4hi)
7252long long __builtin_arm_wmacu (long long, v4hi, v4hi)
7253long long __builtin_arm_wmacuz (v4hi, v4hi)
7254v4hi __builtin_arm_wmadds (v4hi, v4hi)
7255v4hi __builtin_arm_wmaddu (v4hi, v4hi)
7256v8qi __builtin_arm_wmaxsb (v8qi, v8qi)
7257v4hi __builtin_arm_wmaxsh (v4hi, v4hi)
4bc73018 7258v2si __builtin_arm_wmaxsw (v2si, v2si)
d63851eb
ILT
7259v8qi __builtin_arm_wmaxub (v8qi, v8qi)
7260v4hi __builtin_arm_wmaxuh (v4hi, v4hi)
4bc73018 7261v2si __builtin_arm_wmaxuw (v2si, v2si)
d63851eb
ILT
7262v8qi __builtin_arm_wminsb (v8qi, v8qi)
7263v4hi __builtin_arm_wminsh (v4hi, v4hi)
4bc73018 7264v2si __builtin_arm_wminsw (v2si, v2si)
d63851eb
ILT
7265v8qi __builtin_arm_wminub (v8qi, v8qi)
7266v4hi __builtin_arm_wminuh (v4hi, v4hi)
4bc73018 7267v2si __builtin_arm_wminuw (v2si, v2si)
d63851eb
ILT
7268v4hi __builtin_arm_wmulsm (v4hi, v4hi)
7269v4hi __builtin_arm_wmulul (v4hi, v4hi)
7270v4hi __builtin_arm_wmulum (v4hi, v4hi)
7271long long __builtin_arm_wor (long long, long long)
7272v2si __builtin_arm_wpackdss (long long, long long)
7273v2si __builtin_arm_wpackdus (long long, long long)
7274v8qi __builtin_arm_wpackhss (v4hi, v4hi)
7275v8qi __builtin_arm_wpackhus (v4hi, v4hi)
7276v4hi __builtin_arm_wpackwss (v2si, v2si)
7277v4hi __builtin_arm_wpackwus (v2si, v2si)
7278long long __builtin_arm_wrord (long long, long long)
7279long long __builtin_arm_wrordi (long long, int)
7280v4hi __builtin_arm_wrorh (v4hi, long long)
7281v4hi __builtin_arm_wrorhi (v4hi, int)
7282v2si __builtin_arm_wrorw (v2si, long long)
7283v2si __builtin_arm_wrorwi (v2si, int)
7284v2si __builtin_arm_wsadb (v8qi, v8qi)
7285v2si __builtin_arm_wsadbz (v8qi, v8qi)
7286v2si __builtin_arm_wsadh (v4hi, v4hi)
7287v2si __builtin_arm_wsadhz (v4hi, v4hi)
7288v4hi __builtin_arm_wshufh (v4hi, int)
7289long long __builtin_arm_wslld (long long, long long)
7290long long __builtin_arm_wslldi (long long, int)
7291v4hi __builtin_arm_wsllh (v4hi, long long)
7292v4hi __builtin_arm_wsllhi (v4hi, int)
7293v2si __builtin_arm_wsllw (v2si, long long)
4bc73018 7294v2si __builtin_arm_wsllwi (v2si, int)
d63851eb
ILT
7295long long __builtin_arm_wsrad (long long, long long)
7296long long __builtin_arm_wsradi (long long, int)
7297v4hi __builtin_arm_wsrah (v4hi, long long)
7298v4hi __builtin_arm_wsrahi (v4hi, int)
7299v2si __builtin_arm_wsraw (v2si, long long)
4bc73018 7300v2si __builtin_arm_wsrawi (v2si, int)
d63851eb
ILT
7301long long __builtin_arm_wsrld (long long, long long)
7302long long __builtin_arm_wsrldi (long long, int)
7303v4hi __builtin_arm_wsrlh (v4hi, long long)
7304v4hi __builtin_arm_wsrlhi (v4hi, int)
7305v2si __builtin_arm_wsrlw (v2si, long long)
4bc73018 7306v2si __builtin_arm_wsrlwi (v2si, int)
d63851eb
ILT
7307v8qi __builtin_arm_wsubb (v8qi, v8qi)
7308v8qi __builtin_arm_wsubbss (v8qi, v8qi)
7309v8qi __builtin_arm_wsubbus (v8qi, v8qi)
7310v4hi __builtin_arm_wsubh (v4hi, v4hi)
7311v4hi __builtin_arm_wsubhss (v4hi, v4hi)
7312v4hi __builtin_arm_wsubhus (v4hi, v4hi)
7313v2si __builtin_arm_wsubw (v2si, v2si)
7314v2si __builtin_arm_wsubwss (v2si, v2si)
7315v2si __builtin_arm_wsubwus (v2si, v2si)
7316v4hi __builtin_arm_wunpckehsb (v8qi)
7317v2si __builtin_arm_wunpckehsh (v4hi)
7318long long __builtin_arm_wunpckehsw (v2si)
7319v4hi __builtin_arm_wunpckehub (v8qi)
7320v2si __builtin_arm_wunpckehuh (v4hi)
7321long long __builtin_arm_wunpckehuw (v2si)
7322v4hi __builtin_arm_wunpckelsb (v8qi)
7323v2si __builtin_arm_wunpckelsh (v4hi)
7324long long __builtin_arm_wunpckelsw (v2si)
7325v4hi __builtin_arm_wunpckelub (v8qi)
7326v2si __builtin_arm_wunpckeluh (v4hi)
7327long long __builtin_arm_wunpckeluw (v2si)
7328v8qi __builtin_arm_wunpckihb (v8qi, v8qi)
7329v4hi __builtin_arm_wunpckihh (v4hi, v4hi)
4bc73018 7330v2si __builtin_arm_wunpckihw (v2si, v2si)
d63851eb
ILT
7331v8qi __builtin_arm_wunpckilb (v8qi, v8qi)
7332v4hi __builtin_arm_wunpckilh (v4hi, v4hi)
4bc73018 7333v2si __builtin_arm_wunpckilw (v2si, v2si)
d63851eb
ILT
7334long long __builtin_arm_wxor (long long, long long)
7335long long __builtin_arm_wzero ()
3ab51846 7336@end smallexample
4bc73018 7337
88f77cba
JB
7338@node ARM NEON Intrinsics
7339@subsection ARM NEON Intrinsics
7340
7341These built-in intrinsics for the ARM Advanced SIMD extension are available
7342when the @option{-mfpu=neon} switch is used:
7343
7344@include arm-neon-intrinsics.texi
7345
161c21b6
BS
7346@node Blackfin Built-in Functions
7347@subsection Blackfin Built-in Functions
7348
7349Currently, there are two Blackfin-specific built-in functions. These are
7350used for generating @code{CSYNC} and @code{SSYNC} machine insns without
7351using inline assembly; by using these built-in functions the compiler can
7352automatically add workarounds for hardware errata involving these
7353instructions. These functions are named as follows:
7354
7355@smallexample
7356void __builtin_bfin_csync (void)
7357void __builtin_bfin_ssync (void)
7358@end smallexample
7359
c3ee0579
RS
7360@node FR-V Built-in Functions
7361@subsection FR-V Built-in Functions
7362
7363GCC provides many FR-V-specific built-in functions. In general,
7364these functions are intended to be compatible with those described
7365by @cite{FR-V Family, Softune C/C++ Compiler Manual (V6), Fujitsu
7366Semiconductor}. The two exceptions are @code{__MDUNPACKH} and
7367@code{__MBTOHE}, the gcc forms of which pass 128-bit values by
7368pointer rather than by value.
7369
7370Most of the functions are named after specific FR-V instructions.
27ef2cdd 7371Such functions are said to be ``directly mapped'' and are summarized
c3ee0579
RS
7372here in tabular form.
7373
7374@menu
7375* Argument Types::
7376* Directly-mapped Integer Functions::
7377* Directly-mapped Media Functions::
c14ff86e 7378* Raw read/write Functions::
c3ee0579
RS
7379* Other Built-in Functions::
7380@end menu
7381
7382@node Argument Types
7383@subsubsection Argument Types
7384
7385The arguments to the built-in functions can be divided into three groups:
7386register numbers, compile-time constants and run-time values. In order
7387to make this classification clear at a glance, the arguments and return
7388values are given the following pseudo types:
7389
7390@multitable @columnfractions .20 .30 .15 .35
7391@item Pseudo type @tab Real C type @tab Constant? @tab Description
7392@item @code{uh} @tab @code{unsigned short} @tab No @tab an unsigned halfword
7393@item @code{uw1} @tab @code{unsigned int} @tab No @tab an unsigned word
7394@item @code{sw1} @tab @code{int} @tab No @tab a signed word
7395@item @code{uw2} @tab @code{unsigned long long} @tab No
7396@tab an unsigned doubleword
7397@item @code{sw2} @tab @code{long long} @tab No @tab a signed doubleword
7398@item @code{const} @tab @code{int} @tab Yes @tab an integer constant
7399@item @code{acc} @tab @code{int} @tab Yes @tab an ACC register number
7400@item @code{iacc} @tab @code{int} @tab Yes @tab an IACC register number
7401@end multitable
7402
7403These pseudo types are not defined by GCC, they are simply a notational
7404convenience used in this manual.
7405
7406Arguments of type @code{uh}, @code{uw1}, @code{sw1}, @code{uw2}
7407and @code{sw2} are evaluated at run time. They correspond to
7408register operands in the underlying FR-V instructions.
7409
7410@code{const} arguments represent immediate operands in the underlying
7411FR-V instructions. They must be compile-time constants.
7412
7413@code{acc} arguments are evaluated at compile time and specify the number
7414of an accumulator register. For example, an @code{acc} argument of 2
7415will select the ACC2 register.
7416
7417@code{iacc} arguments are similar to @code{acc} arguments but specify the
7418number of an IACC register. See @pxref{Other Built-in Functions}
7419for more details.
7420
7421@node Directly-mapped Integer Functions
7422@subsubsection Directly-mapped Integer Functions
7423
7424The functions listed below map directly to FR-V I-type instructions.
7425
7426@multitable @columnfractions .45 .32 .23
7427@item Function prototype @tab Example usage @tab Assembly output
7428@item @code{sw1 __ADDSS (sw1, sw1)}
7429@tab @code{@var{c} = __ADDSS (@var{a}, @var{b})}
7430@tab @code{ADDSS @var{a},@var{b},@var{c}}
7431@item @code{sw1 __SCAN (sw1, sw1)}
7432@tab @code{@var{c} = __SCAN (@var{a}, @var{b})}
7433@tab @code{SCAN @var{a},@var{b},@var{c}}
7434@item @code{sw1 __SCUTSS (sw1)}
7435@tab @code{@var{b} = __SCUTSS (@var{a})}
7436@tab @code{SCUTSS @var{a},@var{b}}
7437@item @code{sw1 __SLASS (sw1, sw1)}
7438@tab @code{@var{c} = __SLASS (@var{a}, @var{b})}
7439@tab @code{SLASS @var{a},@var{b},@var{c}}
7440@item @code{void __SMASS (sw1, sw1)}
7441@tab @code{__SMASS (@var{a}, @var{b})}
7442@tab @code{SMASS @var{a},@var{b}}
7443@item @code{void __SMSSS (sw1, sw1)}
7444@tab @code{__SMSSS (@var{a}, @var{b})}
7445@tab @code{SMSSS @var{a},@var{b}}
7446@item @code{void __SMU (sw1, sw1)}
7447@tab @code{__SMU (@var{a}, @var{b})}
7448@tab @code{SMU @var{a},@var{b}}
7449@item @code{sw2 __SMUL (sw1, sw1)}
7450@tab @code{@var{c} = __SMUL (@var{a}, @var{b})}
7451@tab @code{SMUL @var{a},@var{b},@var{c}}
7452@item @code{sw1 __SUBSS (sw1, sw1)}
7453@tab @code{@var{c} = __SUBSS (@var{a}, @var{b})}
7454@tab @code{SUBSS @var{a},@var{b},@var{c}}
7455@item @code{uw2 __UMUL (uw1, uw1)}
7456@tab @code{@var{c} = __UMUL (@var{a}, @var{b})}
7457@tab @code{UMUL @var{a},@var{b},@var{c}}
7458@end multitable
7459
7460@node Directly-mapped Media Functions
7461@subsubsection Directly-mapped Media Functions
7462
7463The functions listed below map directly to FR-V M-type instructions.
7464
7465@multitable @columnfractions .45 .32 .23
7466@item Function prototype @tab Example usage @tab Assembly output
7467@item @code{uw1 __MABSHS (sw1)}
7468@tab @code{@var{b} = __MABSHS (@var{a})}
7469@tab @code{MABSHS @var{a},@var{b}}
7470@item @code{void __MADDACCS (acc, acc)}
7471@tab @code{__MADDACCS (@var{b}, @var{a})}
7472@tab @code{MADDACCS @var{a},@var{b}}
7473@item @code{sw1 __MADDHSS (sw1, sw1)}
7474@tab @code{@var{c} = __MADDHSS (@var{a}, @var{b})}
7475@tab @code{MADDHSS @var{a},@var{b},@var{c}}
7476@item @code{uw1 __MADDHUS (uw1, uw1)}
7477@tab @code{@var{c} = __MADDHUS (@var{a}, @var{b})}
7478@tab @code{MADDHUS @var{a},@var{b},@var{c}}
7479@item @code{uw1 __MAND (uw1, uw1)}
7480@tab @code{@var{c} = __MAND (@var{a}, @var{b})}
7481@tab @code{MAND @var{a},@var{b},@var{c}}
7482@item @code{void __MASACCS (acc, acc)}
7483@tab @code{__MASACCS (@var{b}, @var{a})}
7484@tab @code{MASACCS @var{a},@var{b}}
7485@item @code{uw1 __MAVEH (uw1, uw1)}
7486@tab @code{@var{c} = __MAVEH (@var{a}, @var{b})}
7487@tab @code{MAVEH @var{a},@var{b},@var{c}}
7488@item @code{uw2 __MBTOH (uw1)}
7489@tab @code{@var{b} = __MBTOH (@var{a})}
7490@tab @code{MBTOH @var{a},@var{b}}
7491@item @code{void __MBTOHE (uw1 *, uw1)}
7492@tab @code{__MBTOHE (&@var{b}, @var{a})}
7493@tab @code{MBTOHE @var{a},@var{b}}
7494@item @code{void __MCLRACC (acc)}
7495@tab @code{__MCLRACC (@var{a})}
7496@tab @code{MCLRACC @var{a}}
7497@item @code{void __MCLRACCA (void)}
7498@tab @code{__MCLRACCA ()}
7499@tab @code{MCLRACCA}
7500@item @code{uw1 __Mcop1 (uw1, uw1)}
7501@tab @code{@var{c} = __Mcop1 (@var{a}, @var{b})}
7502@tab @code{Mcop1 @var{a},@var{b},@var{c}}
7503@item @code{uw1 __Mcop2 (uw1, uw1)}
7504@tab @code{@var{c} = __Mcop2 (@var{a}, @var{b})}
7505@tab @code{Mcop2 @var{a},@var{b},@var{c}}
7506@item @code{uw1 __MCPLHI (uw2, const)}
7507@tab @code{@var{c} = __MCPLHI (@var{a}, @var{b})}
7508@tab @code{MCPLHI @var{a},#@var{b},@var{c}}
7509@item @code{uw1 __MCPLI (uw2, const)}
7510@tab @code{@var{c} = __MCPLI (@var{a}, @var{b})}
7511@tab @code{MCPLI @var{a},#@var{b},@var{c}}
7512@item @code{void __MCPXIS (acc, sw1, sw1)}
7513@tab @code{__MCPXIS (@var{c}, @var{a}, @var{b})}
7514@tab @code{MCPXIS @var{a},@var{b},@var{c}}
7515@item @code{void __MCPXIU (acc, uw1, uw1)}
7516@tab @code{__MCPXIU (@var{c}, @var{a}, @var{b})}
7517@tab @code{MCPXIU @var{a},@var{b},@var{c}}
7518@item @code{void __MCPXRS (acc, sw1, sw1)}
7519@tab @code{__MCPXRS (@var{c}, @var{a}, @var{b})}
7520@tab @code{MCPXRS @var{a},@var{b},@var{c}}
7521@item @code{void __MCPXRU (acc, uw1, uw1)}
7522@tab @code{__MCPXRU (@var{c}, @var{a}, @var{b})}
7523@tab @code{MCPXRU @var{a},@var{b},@var{c}}
7524@item @code{uw1 __MCUT (acc, uw1)}
7525@tab @code{@var{c} = __MCUT (@var{a}, @var{b})}
7526@tab @code{MCUT @var{a},@var{b},@var{c}}
7527@item @code{uw1 __MCUTSS (acc, sw1)}
7528@tab @code{@var{c} = __MCUTSS (@var{a}, @var{b})}
7529@tab @code{MCUTSS @var{a},@var{b},@var{c}}
7530@item @code{void __MDADDACCS (acc, acc)}
7531@tab @code{__MDADDACCS (@var{b}, @var{a})}
7532@tab @code{MDADDACCS @var{a},@var{b}}
7533@item @code{void __MDASACCS (acc, acc)}
7534@tab @code{__MDASACCS (@var{b}, @var{a})}
7535@tab @code{MDASACCS @var{a},@var{b}}
7536@item @code{uw2 __MDCUTSSI (acc, const)}
7537@tab @code{@var{c} = __MDCUTSSI (@var{a}, @var{b})}
7538@tab @code{MDCUTSSI @var{a},#@var{b},@var{c}}
7539@item @code{uw2 __MDPACKH (uw2, uw2)}
7540@tab @code{@var{c} = __MDPACKH (@var{a}, @var{b})}
7541@tab @code{MDPACKH @var{a},@var{b},@var{c}}
7542@item @code{uw2 __MDROTLI (uw2, const)}
7543@tab @code{@var{c} = __MDROTLI (@var{a}, @var{b})}
7544@tab @code{MDROTLI @var{a},#@var{b},@var{c}}
7545@item @code{void __MDSUBACCS (acc, acc)}
7546@tab @code{__MDSUBACCS (@var{b}, @var{a})}
7547@tab @code{MDSUBACCS @var{a},@var{b}}
7548@item @code{void __MDUNPACKH (uw1 *, uw2)}
7549@tab @code{__MDUNPACKH (&@var{b}, @var{a})}
7550@tab @code{MDUNPACKH @var{a},@var{b}}
7551@item @code{uw2 __MEXPDHD (uw1, const)}
7552@tab @code{@var{c} = __MEXPDHD (@var{a}, @var{b})}
7553@tab @code{MEXPDHD @var{a},#@var{b},@var{c}}
7554@item @code{uw1 __MEXPDHW (uw1, const)}
7555@tab @code{@var{c} = __MEXPDHW (@var{a}, @var{b})}
7556@tab @code{MEXPDHW @var{a},#@var{b},@var{c}}
7557@item @code{uw1 __MHDSETH (uw1, const)}
7558@tab @code{@var{c} = __MHDSETH (@var{a}, @var{b})}
7559@tab @code{MHDSETH @var{a},#@var{b},@var{c}}
7560@item @code{sw1 __MHDSETS (const)}
7561@tab @code{@var{b} = __MHDSETS (@var{a})}
7562@tab @code{MHDSETS #@var{a},@var{b}}
7563@item @code{uw1 __MHSETHIH (uw1, const)}
7564@tab @code{@var{b} = __MHSETHIH (@var{b}, @var{a})}
7565@tab @code{MHSETHIH #@var{a},@var{b}}
7566@item @code{sw1 __MHSETHIS (sw1, const)}
7567@tab @code{@var{b} = __MHSETHIS (@var{b}, @var{a})}
7568@tab @code{MHSETHIS #@var{a},@var{b}}
7569@item @code{uw1 __MHSETLOH (uw1, const)}
7570@tab @code{@var{b} = __MHSETLOH (@var{b}, @var{a})}
7571@tab @code{MHSETLOH #@var{a},@var{b}}
7572@item @code{sw1 __MHSETLOS (sw1, const)}
7573@tab @code{@var{b} = __MHSETLOS (@var{b}, @var{a})}
7574@tab @code{MHSETLOS #@var{a},@var{b}}
7575@item @code{uw1 __MHTOB (uw2)}
7576@tab @code{@var{b} = __MHTOB (@var{a})}
7577@tab @code{MHTOB @var{a},@var{b}}
7578@item @code{void __MMACHS (acc, sw1, sw1)}
7579@tab @code{__MMACHS (@var{c}, @var{a}, @var{b})}
7580@tab @code{MMACHS @var{a},@var{b},@var{c}}
7581@item @code{void __MMACHU (acc, uw1, uw1)}
7582@tab @code{__MMACHU (@var{c}, @var{a}, @var{b})}
7583@tab @code{MMACHU @var{a},@var{b},@var{c}}
7584@item @code{void __MMRDHS (acc, sw1, sw1)}
7585@tab @code{__MMRDHS (@var{c}, @var{a}, @var{b})}
7586@tab @code{MMRDHS @var{a},@var{b},@var{c}}
7587@item @code{void __MMRDHU (acc, uw1, uw1)}
7588@tab @code{__MMRDHU (@var{c}, @var{a}, @var{b})}
7589@tab @code{MMRDHU @var{a},@var{b},@var{c}}
7590@item @code{void __MMULHS (acc, sw1, sw1)}
7591@tab @code{__MMULHS (@var{c}, @var{a}, @var{b})}
7592@tab @code{MMULHS @var{a},@var{b},@var{c}}
7593@item @code{void __MMULHU (acc, uw1, uw1)}
7594@tab @code{__MMULHU (@var{c}, @var{a}, @var{b})}
7595@tab @code{MMULHU @var{a},@var{b},@var{c}}
7596@item @code{void __MMULXHS (acc, sw1, sw1)}
7597@tab @code{__MMULXHS (@var{c}, @var{a}, @var{b})}
7598@tab @code{MMULXHS @var{a},@var{b},@var{c}}
7599@item @code{void __MMULXHU (acc, uw1, uw1)}
7600@tab @code{__MMULXHU (@var{c}, @var{a}, @var{b})}
7601@tab @code{MMULXHU @var{a},@var{b},@var{c}}
7602@item @code{uw1 __MNOT (uw1)}
7603@tab @code{@var{b} = __MNOT (@var{a})}
7604@tab @code{MNOT @var{a},@var{b}}
7605@item @code{uw1 __MOR (uw1, uw1)}
7606@tab @code{@var{c} = __MOR (@var{a}, @var{b})}
7607@tab @code{MOR @var{a},@var{b},@var{c}}
7608@item @code{uw1 __MPACKH (uh, uh)}
7609@tab @code{@var{c} = __MPACKH (@var{a}, @var{b})}
7610@tab @code{MPACKH @var{a},@var{b},@var{c}}
7611@item @code{sw2 __MQADDHSS (sw2, sw2)}
7612@tab @code{@var{c} = __MQADDHSS (@var{a}, @var{b})}
7613@tab @code{MQADDHSS @var{a},@var{b},@var{c}}
7614@item @code{uw2 __MQADDHUS (uw2, uw2)}
7615@tab @code{@var{c} = __MQADDHUS (@var{a}, @var{b})}
7616@tab @code{MQADDHUS @var{a},@var{b},@var{c}}
7617@item @code{void __MQCPXIS (acc, sw2, sw2)}
7618@tab @code{__MQCPXIS (@var{c}, @var{a}, @var{b})}
7619@tab @code{MQCPXIS @var{a},@var{b},@var{c}}
7620@item @code{void __MQCPXIU (acc, uw2, uw2)}
7621@tab @code{__MQCPXIU (@var{c}, @var{a}, @var{b})}
7622@tab @code{MQCPXIU @var{a},@var{b},@var{c}}
7623@item @code{void __MQCPXRS (acc, sw2, sw2)}
7624@tab @code{__MQCPXRS (@var{c}, @var{a}, @var{b})}
7625@tab @code{MQCPXRS @var{a},@var{b},@var{c}}
7626@item @code{void __MQCPXRU (acc, uw2, uw2)}
7627@tab @code{__MQCPXRU (@var{c}, @var{a}, @var{b})}
7628@tab @code{MQCPXRU @var{a},@var{b},@var{c}}
7629@item @code{sw2 __MQLCLRHS (sw2, sw2)}
7630@tab @code{@var{c} = __MQLCLRHS (@var{a}, @var{b})}
7631@tab @code{MQLCLRHS @var{a},@var{b},@var{c}}
7632@item @code{sw2 __MQLMTHS (sw2, sw2)}
7633@tab @code{@var{c} = __MQLMTHS (@var{a}, @var{b})}
7634@tab @code{MQLMTHS @var{a},@var{b},@var{c}}
7635@item @code{void __MQMACHS (acc, sw2, sw2)}
7636@tab @code{__MQMACHS (@var{c}, @var{a}, @var{b})}
7637@tab @code{MQMACHS @var{a},@var{b},@var{c}}
7638@item @code{void __MQMACHU (acc, uw2, uw2)}
7639@tab @code{__MQMACHU (@var{c}, @var{a}, @var{b})}
7640@tab @code{MQMACHU @var{a},@var{b},@var{c}}
7641@item @code{void __MQMACXHS (acc, sw2, sw2)}
7642@tab @code{__MQMACXHS (@var{c}, @var{a}, @var{b})}
7643@tab @code{MQMACXHS @var{a},@var{b},@var{c}}
7644@item @code{void __MQMULHS (acc, sw2, sw2)}
7645@tab @code{__MQMULHS (@var{c}, @var{a}, @var{b})}
7646@tab @code{MQMULHS @var{a},@var{b},@var{c}}
7647@item @code{void __MQMULHU (acc, uw2, uw2)}
7648@tab @code{__MQMULHU (@var{c}, @var{a}, @var{b})}
7649@tab @code{MQMULHU @var{a},@var{b},@var{c}}
7650@item @code{void __MQMULXHS (acc, sw2, sw2)}
7651@tab @code{__MQMULXHS (@var{c}, @var{a}, @var{b})}
7652@tab @code{MQMULXHS @var{a},@var{b},@var{c}}
7653@item @code{void __MQMULXHU (acc, uw2, uw2)}
7654@tab @code{__MQMULXHU (@var{c}, @var{a}, @var{b})}
7655@tab @code{MQMULXHU @var{a},@var{b},@var{c}}
7656@item @code{sw2 __MQSATHS (sw2, sw2)}
7657@tab @code{@var{c} = __MQSATHS (@var{a}, @var{b})}
7658@tab @code{MQSATHS @var{a},@var{b},@var{c}}
7659@item @code{uw2 __MQSLLHI (uw2, int)}
7660@tab @code{@var{c} = __MQSLLHI (@var{a}, @var{b})}
7661@tab @code{MQSLLHI @var{a},@var{b},@var{c}}
7662@item @code{sw2 __MQSRAHI (sw2, int)}
7663@tab @code{@var{c} = __MQSRAHI (@var{a}, @var{b})}
7664@tab @code{MQSRAHI @var{a},@var{b},@var{c}}
7665@item @code{sw2 __MQSUBHSS (sw2, sw2)}
7666@tab @code{@var{c} = __MQSUBHSS (@var{a}, @var{b})}
7667@tab @code{MQSUBHSS @var{a},@var{b},@var{c}}
7668@item @code{uw2 __MQSUBHUS (uw2, uw2)}
7669@tab @code{@var{c} = __MQSUBHUS (@var{a}, @var{b})}
7670@tab @code{MQSUBHUS @var{a},@var{b},@var{c}}
7671@item @code{void __MQXMACHS (acc, sw2, sw2)}
7672@tab @code{__MQXMACHS (@var{c}, @var{a}, @var{b})}
7673@tab @code{MQXMACHS @var{a},@var{b},@var{c}}
7674@item @code{void __MQXMACXHS (acc, sw2, sw2)}
7675@tab @code{__MQXMACXHS (@var{c}, @var{a}, @var{b})}
7676@tab @code{MQXMACXHS @var{a},@var{b},@var{c}}
7677@item @code{uw1 __MRDACC (acc)}
7678@tab @code{@var{b} = __MRDACC (@var{a})}
7679@tab @code{MRDACC @var{a},@var{b}}
7680@item @code{uw1 __MRDACCG (acc)}
7681@tab @code{@var{b} = __MRDACCG (@var{a})}
7682@tab @code{MRDACCG @var{a},@var{b}}
7683@item @code{uw1 __MROTLI (uw1, const)}
7684@tab @code{@var{c} = __MROTLI (@var{a}, @var{b})}
7685@tab @code{MROTLI @var{a},#@var{b},@var{c}}
7686@item @code{uw1 __MROTRI (uw1, const)}
7687@tab @code{@var{c} = __MROTRI (@var{a}, @var{b})}
7688@tab @code{MROTRI @var{a},#@var{b},@var{c}}
7689@item @code{sw1 __MSATHS (sw1, sw1)}
7690@tab @code{@var{c} = __MSATHS (@var{a}, @var{b})}
7691@tab @code{MSATHS @var{a},@var{b},@var{c}}
7692@item @code{uw1 __MSATHU (uw1, uw1)}
7693@tab @code{@var{c} = __MSATHU (@var{a}, @var{b})}
7694@tab @code{MSATHU @var{a},@var{b},@var{c}}
7695@item @code{uw1 __MSLLHI (uw1, const)}
7696@tab @code{@var{c} = __MSLLHI (@var{a}, @var{b})}
7697@tab @code{MSLLHI @var{a},#@var{b},@var{c}}
7698@item @code{sw1 __MSRAHI (sw1, const)}
7699@tab @code{@var{c} = __MSRAHI (@var{a}, @var{b})}
7700@tab @code{MSRAHI @var{a},#@var{b},@var{c}}
7701@item @code{uw1 __MSRLHI (uw1, const)}
7702@tab @code{@var{c} = __MSRLHI (@var{a}, @var{b})}
7703@tab @code{MSRLHI @var{a},#@var{b},@var{c}}
7704@item @code{void __MSUBACCS (acc, acc)}
7705@tab @code{__MSUBACCS (@var{b}, @var{a})}
7706@tab @code{MSUBACCS @var{a},@var{b}}
7707@item @code{sw1 __MSUBHSS (sw1, sw1)}
7708@tab @code{@var{c} = __MSUBHSS (@var{a}, @var{b})}
7709@tab @code{MSUBHSS @var{a},@var{b},@var{c}}
7710@item @code{uw1 __MSUBHUS (uw1, uw1)}
7711@tab @code{@var{c} = __MSUBHUS (@var{a}, @var{b})}
7712@tab @code{MSUBHUS @var{a},@var{b},@var{c}}
7713@item @code{void __MTRAP (void)}
7714@tab @code{__MTRAP ()}
7715@tab @code{MTRAP}
7716@item @code{uw2 __MUNPACKH (uw1)}
7717@tab @code{@var{b} = __MUNPACKH (@var{a})}
7718@tab @code{MUNPACKH @var{a},@var{b}}
7719@item @code{uw1 __MWCUT (uw2, uw1)}
7720@tab @code{@var{c} = __MWCUT (@var{a}, @var{b})}
7721@tab @code{MWCUT @var{a},@var{b},@var{c}}
7722@item @code{void __MWTACC (acc, uw1)}
7723@tab @code{__MWTACC (@var{b}, @var{a})}
7724@tab @code{MWTACC @var{a},@var{b}}
7725@item @code{void __MWTACCG (acc, uw1)}
7726@tab @code{__MWTACCG (@var{b}, @var{a})}
7727@tab @code{MWTACCG @var{a},@var{b}}
7728@item @code{uw1 __MXOR (uw1, uw1)}
7729@tab @code{@var{c} = __MXOR (@var{a}, @var{b})}
7730@tab @code{MXOR @var{a},@var{b},@var{c}}
7731@end multitable
7732
c14ff86e
AH
7733@node Raw read/write Functions
7734@subsubsection Raw read/write Functions
7735
7736This sections describes built-in functions related to read and write
7737instructions to access memory. These functions generate
7738@code{membar} instructions to flush the I/O load and stores where
7739appropriate, as described in Fujitsu's manual described above.
7740
7741@table @code
7742
7743@item unsigned char __builtin_read8 (void *@var{data})
7744@item unsigned short __builtin_read16 (void *@var{data})
7745@item unsigned long __builtin_read32 (void *@var{data})
7746@item unsigned long long __builtin_read64 (void *@var{data})
7747
7748@item void __builtin_write8 (void *@var{data}, unsigned char @var{datum})
7749@item void __builtin_write16 (void *@var{data}, unsigned short @var{datum})
7750@item void __builtin_write32 (void *@var{data}, unsigned long @var{datum})
7751@item void __builtin_write64 (void *@var{data}, unsigned long long @var{datum})
7752@end table
7753
c3ee0579
RS
7754@node Other Built-in Functions
7755@subsubsection Other Built-in Functions
7756
7757This section describes built-in functions that are not named after
7758a specific FR-V instruction.
7759
7760@table @code
7761@item sw2 __IACCreadll (iacc @var{reg})
7762Return the full 64-bit value of IACC0@. The @var{reg} argument is reserved
7763for future expansion and must be 0.
7764
7765@item sw1 __IACCreadl (iacc @var{reg})
7766Return the value of IACC0H if @var{reg} is 0 and IACC0L if @var{reg} is 1.
7767Other values of @var{reg} are rejected as invalid.
7768
7769@item void __IACCsetll (iacc @var{reg}, sw2 @var{x})
7770Set the full 64-bit value of IACC0 to @var{x}. The @var{reg} argument
7771is reserved for future expansion and must be 0.
7772
7773@item void __IACCsetl (iacc @var{reg}, sw1 @var{x})
7774Set IACC0H to @var{x} if @var{reg} is 0 and IACC0L to @var{x} if @var{reg}
7775is 1. Other values of @var{reg} are rejected as invalid.
7776
7777@item void __data_prefetch0 (const void *@var{x})
7778Use the @code{dcpl} instruction to load the contents of address @var{x}
7779into the data cache.
7780
7781@item void __data_prefetch (const void *@var{x})
7782Use the @code{nldub} instruction to load the contents of address @var{x}
7783into the data cache. The instruction will be issued in slot I1@.
7784@end table
7785
0975678f
JM
7786@node X86 Built-in Functions
7787@subsection X86 Built-in Functions
7788
7789These built-in functions are available for the i386 and x86-64 family
7790of computers, depending on the command-line switches used.
7791
75576871
BB
7792Note that, if you specify command-line switches such as @option{-msse},
7793the compiler could use the extended instruction sets even if the built-ins
7794are not used explicitly in the program. For this reason, applications
7795which perform runtime CPU detection must compile separate files for each
7796supported architecture, using the appropriate flags. In particular,
7797the file containing the CPU detection code should be compiled without
7798these options.
7799
0975678f 7800The following machine modes are available for use with MMX built-in functions
333c8841
AH
7801(@pxref{Vector Extensions}): @code{V2SI} for a vector of two 32-bit integers,
7802@code{V4HI} for a vector of four 16-bit integers, and @code{V8QI} for a
7803vector of eight 8-bit integers. Some of the built-in functions operate on
75d8b30e 7804MMX registers as a whole 64-bit entity, these use @code{V1DI} as their mode.
0975678f
JM
7805
7806If 3Dnow extensions are enabled, @code{V2SF} is used as a mode for a vector
333c8841 7807of two 32-bit floating point values.
0975678f 7808
333c8841
AH
7809If SSE extensions are enabled, @code{V4SF} is used for a vector of four 32-bit
7810floating point values. Some instructions use a vector of four 32-bit
0975678f 7811integers, these use @code{V4SI}. Finally, some instructions operate on an
333c8841 7812entire vector register, interpreting it as a 128-bit integer, these use mode
0975678f
JM
7813@code{TI}.
7814
27f56cb1 7815In 64-bit mode, the x86-64 family of processors uses additional built-in
5513e239
UB
7816functions for efficient use of @code{TF} (@code{__float128}) 128-bit
7817floating point and @code{TC} 128-bit complex floating point values.
7818
27f56cb1
GP
7819The following floating point built-in functions are available in 64-bit
7820mode. All of them implement the function that is part of the name.
5513e239
UB
7821
7822@smallexample
7823__float128 __builtin_fabsq (__float128)
7824__float128 __builtin_copysignq (__float128, __float128)
7825@end smallexample
7826
7827The following floating point built-in functions are made available in the
782864-bit mode.
7829
7830@table @code
7831@item __float128 __builtin_infq (void)
7832Similar to @code{__builtin_inf}, except the return type is @code{__float128}.
593812b6
BE
7833@findex __builtin_infq
7834
7835@item __float128 __builtin_huge_valq (void)
7836Similar to @code{__builtin_huge_val}, except the return type is @code{__float128}.
7837@findex __builtin_huge_valq
5513e239
UB
7838@end table
7839
0975678f
JM
7840The following built-in functions are made available by @option{-mmmx}.
7841All of them generate the machine instruction that is part of the name.
7842
3ab51846 7843@smallexample
0975678f
JM
7844v8qi __builtin_ia32_paddb (v8qi, v8qi)
7845v4hi __builtin_ia32_paddw (v4hi, v4hi)
7846v2si __builtin_ia32_paddd (v2si, v2si)
7847v8qi __builtin_ia32_psubb (v8qi, v8qi)
7848v4hi __builtin_ia32_psubw (v4hi, v4hi)
7849v2si __builtin_ia32_psubd (v2si, v2si)
7850v8qi __builtin_ia32_paddsb (v8qi, v8qi)
7851v4hi __builtin_ia32_paddsw (v4hi, v4hi)
7852v8qi __builtin_ia32_psubsb (v8qi, v8qi)
7853v4hi __builtin_ia32_psubsw (v4hi, v4hi)
7854v8qi __builtin_ia32_paddusb (v8qi, v8qi)
7855v4hi __builtin_ia32_paddusw (v4hi, v4hi)
7856v8qi __builtin_ia32_psubusb (v8qi, v8qi)
7857v4hi __builtin_ia32_psubusw (v4hi, v4hi)
7858v4hi __builtin_ia32_pmullw (v4hi, v4hi)
7859v4hi __builtin_ia32_pmulhw (v4hi, v4hi)
7860di __builtin_ia32_pand (di, di)
7861di __builtin_ia32_pandn (di,di)
7862di __builtin_ia32_por (di, di)
7863di __builtin_ia32_pxor (di, di)
7864v8qi __builtin_ia32_pcmpeqb (v8qi, v8qi)
7865v4hi __builtin_ia32_pcmpeqw (v4hi, v4hi)
7866v2si __builtin_ia32_pcmpeqd (v2si, v2si)
7867v8qi __builtin_ia32_pcmpgtb (v8qi, v8qi)
7868v4hi __builtin_ia32_pcmpgtw (v4hi, v4hi)
7869v2si __builtin_ia32_pcmpgtd (v2si, v2si)
7870v8qi __builtin_ia32_punpckhbw (v8qi, v8qi)
7871v4hi __builtin_ia32_punpckhwd (v4hi, v4hi)
7872v2si __builtin_ia32_punpckhdq (v2si, v2si)
7873v8qi __builtin_ia32_punpcklbw (v8qi, v8qi)
7874v4hi __builtin_ia32_punpcklwd (v4hi, v4hi)
7875v2si __builtin_ia32_punpckldq (v2si, v2si)
7876v8qi __builtin_ia32_packsswb (v4hi, v4hi)
7877v4hi __builtin_ia32_packssdw (v2si, v2si)
7878v8qi __builtin_ia32_packuswb (v4hi, v4hi)
10a97ae6 7879
52eaae97
UB
7880v4hi __builtin_ia32_psllw (v4hi, v4hi)
7881v2si __builtin_ia32_pslld (v2si, v2si)
7882v1di __builtin_ia32_psllq (v1di, v1di)
7883v4hi __builtin_ia32_psrlw (v4hi, v4hi)
7884v2si __builtin_ia32_psrld (v2si, v2si)
7885v1di __builtin_ia32_psrlq (v1di, v1di)
7886v4hi __builtin_ia32_psraw (v4hi, v4hi)
7887v2si __builtin_ia32_psrad (v2si, v2si)
7888v4hi __builtin_ia32_psllwi (v4hi, int)
7889v2si __builtin_ia32_pslldi (v2si, int)
7890v1di __builtin_ia32_psllqi (v1di, int)
7891v4hi __builtin_ia32_psrlwi (v4hi, int)
7892v2si __builtin_ia32_psrldi (v2si, int)
7893v1di __builtin_ia32_psrlqi (v1di, int)
7894v4hi __builtin_ia32_psrawi (v4hi, int)
7895v2si __builtin_ia32_psradi (v2si, int)
10a97ae6 7896
3ab51846 7897@end smallexample
0975678f
JM
7898
7899The following built-in functions are made available either with
7900@option{-msse}, or with a combination of @option{-m3dnow} and
7901@option{-march=athlon}. All of them generate the machine
7902instruction that is part of the name.
7903
3ab51846 7904@smallexample
0975678f
JM
7905v4hi __builtin_ia32_pmulhuw (v4hi, v4hi)
7906v8qi __builtin_ia32_pavgb (v8qi, v8qi)
7907v4hi __builtin_ia32_pavgw (v4hi, v4hi)
ab555a5b 7908v1di __builtin_ia32_psadbw (v8qi, v8qi)
0975678f
JM
7909v8qi __builtin_ia32_pmaxub (v8qi, v8qi)
7910v4hi __builtin_ia32_pmaxsw (v4hi, v4hi)
7911v8qi __builtin_ia32_pminub (v8qi, v8qi)
7912v4hi __builtin_ia32_pminsw (v4hi, v4hi)
7913int __builtin_ia32_pextrw (v4hi, int)
7914v4hi __builtin_ia32_pinsrw (v4hi, int, int)
7915int __builtin_ia32_pmovmskb (v8qi)
7916void __builtin_ia32_maskmovq (v8qi, v8qi, char *)
7917void __builtin_ia32_movntq (di *, di)
7918void __builtin_ia32_sfence (void)
3ab51846 7919@end smallexample
0975678f
JM
7920
7921The following built-in functions are available when @option{-msse} is used.
7922All of them generate the machine instruction that is part of the name.
7923
3ab51846 7924@smallexample
0975678f
JM
7925int __builtin_ia32_comieq (v4sf, v4sf)
7926int __builtin_ia32_comineq (v4sf, v4sf)
7927int __builtin_ia32_comilt (v4sf, v4sf)
7928int __builtin_ia32_comile (v4sf, v4sf)
7929int __builtin_ia32_comigt (v4sf, v4sf)
7930int __builtin_ia32_comige (v4sf, v4sf)
7931int __builtin_ia32_ucomieq (v4sf, v4sf)
7932int __builtin_ia32_ucomineq (v4sf, v4sf)
7933int __builtin_ia32_ucomilt (v4sf, v4sf)
7934int __builtin_ia32_ucomile (v4sf, v4sf)
7935int __builtin_ia32_ucomigt (v4sf, v4sf)
7936int __builtin_ia32_ucomige (v4sf, v4sf)
7937v4sf __builtin_ia32_addps (v4sf, v4sf)
7938v4sf __builtin_ia32_subps (v4sf, v4sf)
7939v4sf __builtin_ia32_mulps (v4sf, v4sf)
7940v4sf __builtin_ia32_divps (v4sf, v4sf)
7941v4sf __builtin_ia32_addss (v4sf, v4sf)
7942v4sf __builtin_ia32_subss (v4sf, v4sf)
7943v4sf __builtin_ia32_mulss (v4sf, v4sf)
7944v4sf __builtin_ia32_divss (v4sf, v4sf)
7945v4si __builtin_ia32_cmpeqps (v4sf, v4sf)
7946v4si __builtin_ia32_cmpltps (v4sf, v4sf)
7947v4si __builtin_ia32_cmpleps (v4sf, v4sf)
7948v4si __builtin_ia32_cmpgtps (v4sf, v4sf)
7949v4si __builtin_ia32_cmpgeps (v4sf, v4sf)
7950v4si __builtin_ia32_cmpunordps (v4sf, v4sf)
7951v4si __builtin_ia32_cmpneqps (v4sf, v4sf)
7952v4si __builtin_ia32_cmpnltps (v4sf, v4sf)
7953v4si __builtin_ia32_cmpnleps (v4sf, v4sf)
7954v4si __builtin_ia32_cmpngtps (v4sf, v4sf)
7955v4si __builtin_ia32_cmpngeps (v4sf, v4sf)
7956v4si __builtin_ia32_cmpordps (v4sf, v4sf)
7957v4si __builtin_ia32_cmpeqss (v4sf, v4sf)
7958v4si __builtin_ia32_cmpltss (v4sf, v4sf)
7959v4si __builtin_ia32_cmpless (v4sf, v4sf)
0975678f
JM
7960v4si __builtin_ia32_cmpunordss (v4sf, v4sf)
7961v4si __builtin_ia32_cmpneqss (v4sf, v4sf)
7962v4si __builtin_ia32_cmpnlts (v4sf, v4sf)
7963v4si __builtin_ia32_cmpnless (v4sf, v4sf)
0975678f
JM
7964v4si __builtin_ia32_cmpordss (v4sf, v4sf)
7965v4sf __builtin_ia32_maxps (v4sf, v4sf)
7966v4sf __builtin_ia32_maxss (v4sf, v4sf)
7967v4sf __builtin_ia32_minps (v4sf, v4sf)
7968v4sf __builtin_ia32_minss (v4sf, v4sf)
7969v4sf __builtin_ia32_andps (v4sf, v4sf)
7970v4sf __builtin_ia32_andnps (v4sf, v4sf)
7971v4sf __builtin_ia32_orps (v4sf, v4sf)
7972v4sf __builtin_ia32_xorps (v4sf, v4sf)
7973v4sf __builtin_ia32_movss (v4sf, v4sf)
7974v4sf __builtin_ia32_movhlps (v4sf, v4sf)
7975v4sf __builtin_ia32_movlhps (v4sf, v4sf)
7976v4sf __builtin_ia32_unpckhps (v4sf, v4sf)
7977v4sf __builtin_ia32_unpcklps (v4sf, v4sf)
7978v4sf __builtin_ia32_cvtpi2ps (v4sf, v2si)
7979v4sf __builtin_ia32_cvtsi2ss (v4sf, int)
7980v2si __builtin_ia32_cvtps2pi (v4sf)
7981int __builtin_ia32_cvtss2si (v4sf)
7982v2si __builtin_ia32_cvttps2pi (v4sf)
7983int __builtin_ia32_cvttss2si (v4sf)
7984v4sf __builtin_ia32_rcpps (v4sf)
7985v4sf __builtin_ia32_rsqrtps (v4sf)
7986v4sf __builtin_ia32_sqrtps (v4sf)
7987v4sf __builtin_ia32_rcpss (v4sf)
7988v4sf __builtin_ia32_rsqrtss (v4sf)
7989v4sf __builtin_ia32_sqrtss (v4sf)
7990v4sf __builtin_ia32_shufps (v4sf, v4sf, int)
7991void __builtin_ia32_movntps (float *, v4sf)
7992int __builtin_ia32_movmskps (v4sf)
3ab51846 7993@end smallexample
0975678f
JM
7994
7995The following built-in functions are available when @option{-msse} is used.
7996
7997@table @code
7998@item v4sf __builtin_ia32_loadaps (float *)
7999Generates the @code{movaps} machine instruction as a load from memory.
8000@item void __builtin_ia32_storeaps (float *, v4sf)
8001Generates the @code{movaps} machine instruction as a store to memory.
8002@item v4sf __builtin_ia32_loadups (float *)
8003Generates the @code{movups} machine instruction as a load from memory.
8004@item void __builtin_ia32_storeups (float *, v4sf)
8005Generates the @code{movups} machine instruction as a store to memory.
8006@item v4sf __builtin_ia32_loadsss (float *)
8007Generates the @code{movss} machine instruction as a load from memory.
8008@item void __builtin_ia32_storess (float *, v4sf)
8009Generates the @code{movss} machine instruction as a store to memory.
bb1418c1 8010@item v4sf __builtin_ia32_loadhps (v4sf, const v2sf *)
0975678f 8011Generates the @code{movhps} machine instruction as a load from memory.
bb1418c1 8012@item v4sf __builtin_ia32_loadlps (v4sf, const v2sf *)
0975678f 8013Generates the @code{movlps} machine instruction as a load from memory
bb1418c1 8014@item void __builtin_ia32_storehps (v2sf *, v4sf)
0975678f 8015Generates the @code{movhps} machine instruction as a store to memory.
bb1418c1 8016@item void __builtin_ia32_storelps (v2sf *, v4sf)
0975678f
JM
8017Generates the @code{movlps} machine instruction as a store to memory.
8018@end table
8019
d7aa4788
RG
8020The following built-in functions are available when @option{-msse2} is used.
8021All of them generate the machine instruction that is part of the name.
8022
8023@smallexample
8024int __builtin_ia32_comisdeq (v2df, v2df)
8025int __builtin_ia32_comisdlt (v2df, v2df)
8026int __builtin_ia32_comisdle (v2df, v2df)
8027int __builtin_ia32_comisdgt (v2df, v2df)
8028int __builtin_ia32_comisdge (v2df, v2df)
8029int __builtin_ia32_comisdneq (v2df, v2df)
8030int __builtin_ia32_ucomisdeq (v2df, v2df)
8031int __builtin_ia32_ucomisdlt (v2df, v2df)
8032int __builtin_ia32_ucomisdle (v2df, v2df)
8033int __builtin_ia32_ucomisdgt (v2df, v2df)
8034int __builtin_ia32_ucomisdge (v2df, v2df)
8035int __builtin_ia32_ucomisdneq (v2df, v2df)
8036v2df __builtin_ia32_cmpeqpd (v2df, v2df)
8037v2df __builtin_ia32_cmpltpd (v2df, v2df)
8038v2df __builtin_ia32_cmplepd (v2df, v2df)
8039v2df __builtin_ia32_cmpgtpd (v2df, v2df)
8040v2df __builtin_ia32_cmpgepd (v2df, v2df)
8041v2df __builtin_ia32_cmpunordpd (v2df, v2df)
8042v2df __builtin_ia32_cmpneqpd (v2df, v2df)
8043v2df __builtin_ia32_cmpnltpd (v2df, v2df)
8044v2df __builtin_ia32_cmpnlepd (v2df, v2df)
8045v2df __builtin_ia32_cmpngtpd (v2df, v2df)
8046v2df __builtin_ia32_cmpngepd (v2df, v2df)
8047v2df __builtin_ia32_cmpordpd (v2df, v2df)
8048v2df __builtin_ia32_cmpeqsd (v2df, v2df)
8049v2df __builtin_ia32_cmpltsd (v2df, v2df)
8050v2df __builtin_ia32_cmplesd (v2df, v2df)
8051v2df __builtin_ia32_cmpunordsd (v2df, v2df)
8052v2df __builtin_ia32_cmpneqsd (v2df, v2df)
8053v2df __builtin_ia32_cmpnltsd (v2df, v2df)
8054v2df __builtin_ia32_cmpnlesd (v2df, v2df)
8055v2df __builtin_ia32_cmpordsd (v2df, v2df)
8056v2di __builtin_ia32_paddq (v2di, v2di)
8057v2di __builtin_ia32_psubq (v2di, v2di)
8058v2df __builtin_ia32_addpd (v2df, v2df)
8059v2df __builtin_ia32_subpd (v2df, v2df)
8060v2df __builtin_ia32_mulpd (v2df, v2df)
8061v2df __builtin_ia32_divpd (v2df, v2df)
8062v2df __builtin_ia32_addsd (v2df, v2df)
8063v2df __builtin_ia32_subsd (v2df, v2df)
8064v2df __builtin_ia32_mulsd (v2df, v2df)
8065v2df __builtin_ia32_divsd (v2df, v2df)
8066v2df __builtin_ia32_minpd (v2df, v2df)
8067v2df __builtin_ia32_maxpd (v2df, v2df)
8068v2df __builtin_ia32_minsd (v2df, v2df)
8069v2df __builtin_ia32_maxsd (v2df, v2df)
8070v2df __builtin_ia32_andpd (v2df, v2df)
8071v2df __builtin_ia32_andnpd (v2df, v2df)
8072v2df __builtin_ia32_orpd (v2df, v2df)
8073v2df __builtin_ia32_xorpd (v2df, v2df)
8074v2df __builtin_ia32_movsd (v2df, v2df)
8075v2df __builtin_ia32_unpckhpd (v2df, v2df)
8076v2df __builtin_ia32_unpcklpd (v2df, v2df)
8077v16qi __builtin_ia32_paddb128 (v16qi, v16qi)
8078v8hi __builtin_ia32_paddw128 (v8hi, v8hi)
8079v4si __builtin_ia32_paddd128 (v4si, v4si)
8080v2di __builtin_ia32_paddq128 (v2di, v2di)
8081v16qi __builtin_ia32_psubb128 (v16qi, v16qi)
8082v8hi __builtin_ia32_psubw128 (v8hi, v8hi)
8083v4si __builtin_ia32_psubd128 (v4si, v4si)
8084v2di __builtin_ia32_psubq128 (v2di, v2di)
8085v8hi __builtin_ia32_pmullw128 (v8hi, v8hi)
8086v8hi __builtin_ia32_pmulhw128 (v8hi, v8hi)
8087v2di __builtin_ia32_pand128 (v2di, v2di)
8088v2di __builtin_ia32_pandn128 (v2di, v2di)
8089v2di __builtin_ia32_por128 (v2di, v2di)
8090v2di __builtin_ia32_pxor128 (v2di, v2di)
8091v16qi __builtin_ia32_pavgb128 (v16qi, v16qi)
8092v8hi __builtin_ia32_pavgw128 (v8hi, v8hi)
8093v16qi __builtin_ia32_pcmpeqb128 (v16qi, v16qi)
8094v8hi __builtin_ia32_pcmpeqw128 (v8hi, v8hi)
8095v4si __builtin_ia32_pcmpeqd128 (v4si, v4si)
8096v16qi __builtin_ia32_pcmpgtb128 (v16qi, v16qi)
8097v8hi __builtin_ia32_pcmpgtw128 (v8hi, v8hi)
8098v4si __builtin_ia32_pcmpgtd128 (v4si, v4si)
8099v16qi __builtin_ia32_pmaxub128 (v16qi, v16qi)
8100v8hi __builtin_ia32_pmaxsw128 (v8hi, v8hi)
8101v16qi __builtin_ia32_pminub128 (v16qi, v16qi)
8102v8hi __builtin_ia32_pminsw128 (v8hi, v8hi)
8103v16qi __builtin_ia32_punpckhbw128 (v16qi, v16qi)
8104v8hi __builtin_ia32_punpckhwd128 (v8hi, v8hi)
8105v4si __builtin_ia32_punpckhdq128 (v4si, v4si)
8106v2di __builtin_ia32_punpckhqdq128 (v2di, v2di)
8107v16qi __builtin_ia32_punpcklbw128 (v16qi, v16qi)
8108v8hi __builtin_ia32_punpcklwd128 (v8hi, v8hi)
8109v4si __builtin_ia32_punpckldq128 (v4si, v4si)
8110v2di __builtin_ia32_punpcklqdq128 (v2di, v2di)
1b667c82
L
8111v16qi __builtin_ia32_packsswb128 (v8hi, v8hi)
8112v8hi __builtin_ia32_packssdw128 (v4si, v4si)
8113v16qi __builtin_ia32_packuswb128 (v8hi, v8hi)
d7aa4788
RG
8114v8hi __builtin_ia32_pmulhuw128 (v8hi, v8hi)
8115void __builtin_ia32_maskmovdqu (v16qi, v16qi)
8116v2df __builtin_ia32_loadupd (double *)
8117void __builtin_ia32_storeupd (double *, v2df)
bb1418c1
L
8118v2df __builtin_ia32_loadhpd (v2df, double const *)
8119v2df __builtin_ia32_loadlpd (v2df, double const *)
d7aa4788
RG
8120int __builtin_ia32_movmskpd (v2df)
8121int __builtin_ia32_pmovmskb128 (v16qi)
8122void __builtin_ia32_movnti (int *, int)
8123void __builtin_ia32_movntpd (double *, v2df)
8124void __builtin_ia32_movntdq (v2df *, v2df)
8125v4si __builtin_ia32_pshufd (v4si, int)
8126v8hi __builtin_ia32_pshuflw (v8hi, int)
8127v8hi __builtin_ia32_pshufhw (v8hi, int)
8128v2di __builtin_ia32_psadbw128 (v16qi, v16qi)
8129v2df __builtin_ia32_sqrtpd (v2df)
8130v2df __builtin_ia32_sqrtsd (v2df)
8131v2df __builtin_ia32_shufpd (v2df, v2df, int)
8132v2df __builtin_ia32_cvtdq2pd (v4si)
8133v4sf __builtin_ia32_cvtdq2ps (v4si)
8134v4si __builtin_ia32_cvtpd2dq (v2df)
8135v2si __builtin_ia32_cvtpd2pi (v2df)
8136v4sf __builtin_ia32_cvtpd2ps (v2df)
8137v4si __builtin_ia32_cvttpd2dq (v2df)
8138v2si __builtin_ia32_cvttpd2pi (v2df)
8139v2df __builtin_ia32_cvtpi2pd (v2si)
8140int __builtin_ia32_cvtsd2si (v2df)
8141int __builtin_ia32_cvttsd2si (v2df)
8142long long __builtin_ia32_cvtsd2si64 (v2df)
8143long long __builtin_ia32_cvttsd2si64 (v2df)
8144v4si __builtin_ia32_cvtps2dq (v4sf)
8145v2df __builtin_ia32_cvtps2pd (v4sf)
8146v4si __builtin_ia32_cvttps2dq (v4sf)
8147v2df __builtin_ia32_cvtsi2sd (v2df, int)
8148v2df __builtin_ia32_cvtsi642sd (v2df, long long)
8149v4sf __builtin_ia32_cvtsd2ss (v4sf, v2df)
8150v2df __builtin_ia32_cvtss2sd (v2df, v4sf)
8151void __builtin_ia32_clflush (const void *)
8152void __builtin_ia32_lfence (void)
8153void __builtin_ia32_mfence (void)
8154v16qi __builtin_ia32_loaddqu (const char *)
8155void __builtin_ia32_storedqu (char *, v16qi)
ab555a5b 8156v1di __builtin_ia32_pmuludq (v2si, v2si)
d7aa4788 8157v2di __builtin_ia32_pmuludq128 (v4si, v4si)
52eaae97
UB
8158v8hi __builtin_ia32_psllw128 (v8hi, v8hi)
8159v4si __builtin_ia32_pslld128 (v4si, v4si)
8160v2di __builtin_ia32_psllq128 (v2di, v2di)
8161v8hi __builtin_ia32_psrlw128 (v8hi, v8hi)
8162v4si __builtin_ia32_psrld128 (v4si, v4si)
d7aa4788 8163v2di __builtin_ia32_psrlq128 (v2di, v2di)
52eaae97
UB
8164v8hi __builtin_ia32_psraw128 (v8hi, v8hi)
8165v4si __builtin_ia32_psrad128 (v4si, v4si)
d7aa4788
RG
8166v2di __builtin_ia32_pslldqi128 (v2di, int)
8167v8hi __builtin_ia32_psllwi128 (v8hi, int)
8168v4si __builtin_ia32_pslldi128 (v4si, int)
8169v2di __builtin_ia32_psllqi128 (v2di, int)
8170v2di __builtin_ia32_psrldqi128 (v2di, int)
8171v8hi __builtin_ia32_psrlwi128 (v8hi, int)
8172v4si __builtin_ia32_psrldi128 (v4si, int)
8173v2di __builtin_ia32_psrlqi128 (v2di, int)
8174v8hi __builtin_ia32_psrawi128 (v8hi, int)
8175v4si __builtin_ia32_psradi128 (v4si, int)
8176v4si __builtin_ia32_pmaddwd128 (v8hi, v8hi)
b53b23dc 8177v2di __builtin_ia32_movq128 (v2di)
d7aa4788
RG
8178@end smallexample
8179
9e200aaf 8180The following built-in functions are available when @option{-msse3} is used.
22c7c85e
L
8181All of them generate the machine instruction that is part of the name.
8182
3ab51846 8183@smallexample
22c7c85e 8184v2df __builtin_ia32_addsubpd (v2df, v2df)
d7aa4788 8185v4sf __builtin_ia32_addsubps (v4sf, v4sf)
22c7c85e 8186v2df __builtin_ia32_haddpd (v2df, v2df)
d7aa4788 8187v4sf __builtin_ia32_haddps (v4sf, v4sf)
22c7c85e 8188v2df __builtin_ia32_hsubpd (v2df, v2df)
d7aa4788 8189v4sf __builtin_ia32_hsubps (v4sf, v4sf)
22c7c85e
L
8190v16qi __builtin_ia32_lddqu (char const *)
8191void __builtin_ia32_monitor (void *, unsigned int, unsigned int)
8192v2df __builtin_ia32_movddup (v2df)
8193v4sf __builtin_ia32_movshdup (v4sf)
8194v4sf __builtin_ia32_movsldup (v4sf)
8195void __builtin_ia32_mwait (unsigned int, unsigned int)
3ab51846 8196@end smallexample
22c7c85e 8197
9e200aaf 8198The following built-in functions are available when @option{-msse3} is used.
22c7c85e
L
8199
8200@table @code
8201@item v2df __builtin_ia32_loadddup (double const *)
8202Generates the @code{movddup} machine instruction as a load from memory.
8203@end table
8204
b1875f52
L
8205The following built-in functions are available when @option{-mssse3} is used.
8206All of them generate the machine instruction that is part of the name
8207with MMX registers.
8208
8209@smallexample
8210v2si __builtin_ia32_phaddd (v2si, v2si)
8211v4hi __builtin_ia32_phaddw (v4hi, v4hi)
8212v4hi __builtin_ia32_phaddsw (v4hi, v4hi)
8213v2si __builtin_ia32_phsubd (v2si, v2si)
8214v4hi __builtin_ia32_phsubw (v4hi, v4hi)
8215v4hi __builtin_ia32_phsubsw (v4hi, v4hi)
1b667c82 8216v4hi __builtin_ia32_pmaddubsw (v8qi, v8qi)
b1875f52
L
8217v4hi __builtin_ia32_pmulhrsw (v4hi, v4hi)
8218v8qi __builtin_ia32_pshufb (v8qi, v8qi)
8219v8qi __builtin_ia32_psignb (v8qi, v8qi)
8220v2si __builtin_ia32_psignd (v2si, v2si)
8221v4hi __builtin_ia32_psignw (v4hi, v4hi)
99c25ac1 8222v1di __builtin_ia32_palignr (v1di, v1di, int)
b1875f52
L
8223v8qi __builtin_ia32_pabsb (v8qi)
8224v2si __builtin_ia32_pabsd (v2si)
8225v4hi __builtin_ia32_pabsw (v4hi)
8226@end smallexample
8227
8228The following built-in functions are available when @option{-mssse3} is used.
8229All of them generate the machine instruction that is part of the name
8230with SSE registers.
8231
8232@smallexample
8233v4si __builtin_ia32_phaddd128 (v4si, v4si)
8234v8hi __builtin_ia32_phaddw128 (v8hi, v8hi)
8235v8hi __builtin_ia32_phaddsw128 (v8hi, v8hi)
8236v4si __builtin_ia32_phsubd128 (v4si, v4si)
8237v8hi __builtin_ia32_phsubw128 (v8hi, v8hi)
8238v8hi __builtin_ia32_phsubsw128 (v8hi, v8hi)
1b667c82 8239v8hi __builtin_ia32_pmaddubsw128 (v16qi, v16qi)
b1875f52
L
8240v8hi __builtin_ia32_pmulhrsw128 (v8hi, v8hi)
8241v16qi __builtin_ia32_pshufb128 (v16qi, v16qi)
8242v16qi __builtin_ia32_psignb128 (v16qi, v16qi)
8243v4si __builtin_ia32_psignd128 (v4si, v4si)
8244v8hi __builtin_ia32_psignw128 (v8hi, v8hi)
858e5e79 8245v2di __builtin_ia32_palignr128 (v2di, v2di, int)
b1875f52
L
8246v16qi __builtin_ia32_pabsb128 (v16qi)
8247v4si __builtin_ia32_pabsd128 (v4si)
8248v8hi __builtin_ia32_pabsw128 (v8hi)
8249@end smallexample
8250
9a5cee02
L
8251The following built-in functions are available when @option{-msse4.1} is
8252used. All of them generate the machine instruction that is part of the
8253name.
8254
8255@smallexample
8256v2df __builtin_ia32_blendpd (v2df, v2df, const int)
8257v4sf __builtin_ia32_blendps (v4sf, v4sf, const int)
8258v2df __builtin_ia32_blendvpd (v2df, v2df, v2df)
8259v4sf __builtin_ia32_blendvps (v4sf, v4sf, v4sf)
291d9a2d 8260v2df __builtin_ia32_dppd (v2df, v2df, const int)
9a5cee02
L
8261v4sf __builtin_ia32_dpps (v4sf, v4sf, const int)
8262v4sf __builtin_ia32_insertps128 (v4sf, v4sf, const int)
8263v2di __builtin_ia32_movntdqa (v2di *);
8264v16qi __builtin_ia32_mpsadbw128 (v16qi, v16qi, const int)
8265v8hi __builtin_ia32_packusdw128 (v4si, v4si)
8266v16qi __builtin_ia32_pblendvb128 (v16qi, v16qi, v16qi)
8267v8hi __builtin_ia32_pblendw128 (v8hi, v8hi, const int)
8268v2di __builtin_ia32_pcmpeqq (v2di, v2di)
8269v8hi __builtin_ia32_phminposuw128 (v8hi)
8270v16qi __builtin_ia32_pmaxsb128 (v16qi, v16qi)
8271v4si __builtin_ia32_pmaxsd128 (v4si, v4si)
8272v4si __builtin_ia32_pmaxud128 (v4si, v4si)
8273v8hi __builtin_ia32_pmaxuw128 (v8hi, v8hi)
8274v16qi __builtin_ia32_pminsb128 (v16qi, v16qi)
8275v4si __builtin_ia32_pminsd128 (v4si, v4si)
8276v4si __builtin_ia32_pminud128 (v4si, v4si)
8277v8hi __builtin_ia32_pminuw128 (v8hi, v8hi)
8278v4si __builtin_ia32_pmovsxbd128 (v16qi)
8279v2di __builtin_ia32_pmovsxbq128 (v16qi)
8280v8hi __builtin_ia32_pmovsxbw128 (v16qi)
8281v2di __builtin_ia32_pmovsxdq128 (v4si)
8282v4si __builtin_ia32_pmovsxwd128 (v8hi)
8283v2di __builtin_ia32_pmovsxwq128 (v8hi)
8284v4si __builtin_ia32_pmovzxbd128 (v16qi)
8285v2di __builtin_ia32_pmovzxbq128 (v16qi)
8286v8hi __builtin_ia32_pmovzxbw128 (v16qi)
8287v2di __builtin_ia32_pmovzxdq128 (v4si)
8288v4si __builtin_ia32_pmovzxwd128 (v8hi)
8289v2di __builtin_ia32_pmovzxwq128 (v8hi)
8290v2di __builtin_ia32_pmuldq128 (v4si, v4si)
8291v4si __builtin_ia32_pmulld128 (v4si, v4si)
8292int __builtin_ia32_ptestc128 (v2di, v2di)
8293int __builtin_ia32_ptestnzc128 (v2di, v2di)
8294int __builtin_ia32_ptestz128 (v2di, v2di)
8295v2df __builtin_ia32_roundpd (v2df, const int)
8296v4sf __builtin_ia32_roundps (v4sf, const int)
8297v2df __builtin_ia32_roundsd (v2df, v2df, const int)
8298v4sf __builtin_ia32_roundss (v4sf, v4sf, const int)
8299@end smallexample
8300
8301The following built-in functions are available when @option{-msse4.1} is
8302used.
8303
8304@table @code
8305@item v4sf __builtin_ia32_vec_set_v4sf (v4sf, float, const int)
8306Generates the @code{insertps} machine instruction.
8307@item int __builtin_ia32_vec_ext_v16qi (v16qi, const int)
8308Generates the @code{pextrb} machine instruction.
8309@item v16qi __builtin_ia32_vec_set_v16qi (v16qi, int, const int)
8310Generates the @code{pinsrb} machine instruction.
8311@item v4si __builtin_ia32_vec_set_v4si (v4si, int, const int)
8312Generates the @code{pinsrd} machine instruction.
8313@item v2di __builtin_ia32_vec_set_v2di (v2di, long long, const int)
8314Generates the @code{pinsrq} machine instruction in 64bit mode.
8315@end table
8316
8317The following built-in functions are changed to generate new SSE4.1
8318instructions when @option{-msse4.1} is used.
8319
8320@table @code
8321@item float __builtin_ia32_vec_ext_v4sf (v4sf, const int)
8322Generates the @code{extractps} machine instruction.
8323@item int __builtin_ia32_vec_ext_v4si (v4si, const int)
8324Generates the @code{pextrd} machine instruction.
8325@item long long __builtin_ia32_vec_ext_v2di (v2di, const int)
8326Generates the @code{pextrq} machine instruction in 64bit mode.
8327@end table
8328
3b8dd071
L
8329The following built-in functions are available when @option{-msse4.2} is
8330used. All of them generate the machine instruction that is part of the
8331name.
8332
8333@smallexample
8334v16qi __builtin_ia32_pcmpestrm128 (v16qi, int, v16qi, int, const int)
8335int __builtin_ia32_pcmpestri128 (v16qi, int, v16qi, int, const int)
8336int __builtin_ia32_pcmpestria128 (v16qi, int, v16qi, int, const int)
8337int __builtin_ia32_pcmpestric128 (v16qi, int, v16qi, int, const int)
8338int __builtin_ia32_pcmpestrio128 (v16qi, int, v16qi, int, const int)
8339int __builtin_ia32_pcmpestris128 (v16qi, int, v16qi, int, const int)
8340int __builtin_ia32_pcmpestriz128 (v16qi, int, v16qi, int, const int)
8341v16qi __builtin_ia32_pcmpistrm128 (v16qi, v16qi, const int)
8342int __builtin_ia32_pcmpistri128 (v16qi, v16qi, const int)
8343int __builtin_ia32_pcmpistria128 (v16qi, v16qi, const int)
8344int __builtin_ia32_pcmpistric128 (v16qi, v16qi, const int)
8345int __builtin_ia32_pcmpistrio128 (v16qi, v16qi, const int)
8346int __builtin_ia32_pcmpistris128 (v16qi, v16qi, const int)
8347int __builtin_ia32_pcmpistriz128 (v16qi, v16qi, const int)
291d9a2d 8348v2di __builtin_ia32_pcmpgtq (v2di, v2di)
3b8dd071
L
8349@end smallexample
8350
8351The following built-in functions are available when @option{-msse4.2} is
8352used.
8353
8354@table @code
291d9a2d 8355@item unsigned int __builtin_ia32_crc32qi (unsigned int, unsigned char)
3b8dd071 8356Generates the @code{crc32b} machine instruction.
291d9a2d 8357@item unsigned int __builtin_ia32_crc32hi (unsigned int, unsigned short)
3b8dd071 8358Generates the @code{crc32w} machine instruction.
291d9a2d 8359@item unsigned int __builtin_ia32_crc32si (unsigned int, unsigned int)
3b8dd071 8360Generates the @code{crc32l} machine instruction.
a44acfb9 8361@item unsigned long long __builtin_ia32_crc32di (unsigned long long, unsigned long long)
3b8dd071
L
8362@end table
8363
8364The following built-in functions are changed to generate new SSE4.2
8365instructions when @option{-msse4.2} is used.
8366
8367@table @code
291d9a2d 8368@item int __builtin_popcount (unsigned int)
3b8dd071 8369Generates the @code{popcntl} machine instruction.
291d9a2d 8370@item int __builtin_popcountl (unsigned long)
3b8dd071
L
8371Generates the @code{popcntl} or @code{popcntq} machine instruction,
8372depending on the size of @code{unsigned long}.
291d9a2d 8373@item int __builtin_popcountll (unsigned long long)
3b8dd071
L
8374Generates the @code{popcntq} machine instruction.
8375@end table
8376
31cb596a
JY
8377The following built-in functions are available when @option{-mavx} is
8378used. All of them generate the machine instruction that is part of the
8379name.
8380
8381@smallexample
8382v4df __builtin_ia32_addpd256 (v4df,v4df)
8383v8sf __builtin_ia32_addps256 (v8sf,v8sf)
8384v4df __builtin_ia32_addsubpd256 (v4df,v4df)
8385v8sf __builtin_ia32_addsubps256 (v8sf,v8sf)
8386v4df __builtin_ia32_andnpd256 (v4df,v4df)
8387v8sf __builtin_ia32_andnps256 (v8sf,v8sf)
8388v4df __builtin_ia32_andpd256 (v4df,v4df)
8389v8sf __builtin_ia32_andps256 (v8sf,v8sf)
8390v4df __builtin_ia32_blendpd256 (v4df,v4df,int)
8391v8sf __builtin_ia32_blendps256 (v8sf,v8sf,int)
8392v4df __builtin_ia32_blendvpd256 (v4df,v4df,v4df)
8393v8sf __builtin_ia32_blendvps256 (v8sf,v8sf,v8sf)
8394v2df __builtin_ia32_cmppd (v2df,v2df,int)
8395v4df __builtin_ia32_cmppd256 (v4df,v4df,int)
8396v4sf __builtin_ia32_cmpps (v4sf,v4sf,int)
8397v8sf __builtin_ia32_cmpps256 (v8sf,v8sf,int)
8398v2df __builtin_ia32_cmpsd (v2df,v2df,int)
8399v4sf __builtin_ia32_cmpss (v4sf,v4sf,int)
8400v4df __builtin_ia32_cvtdq2pd256 (v4si)
8401v8sf __builtin_ia32_cvtdq2ps256 (v8si)
8402v4si __builtin_ia32_cvtpd2dq256 (v4df)
8403v4sf __builtin_ia32_cvtpd2ps256 (v4df)
8404v8si __builtin_ia32_cvtps2dq256 (v8sf)
8405v4df __builtin_ia32_cvtps2pd256 (v4sf)
8406v4si __builtin_ia32_cvttpd2dq256 (v4df)
8407v8si __builtin_ia32_cvttps2dq256 (v8sf)
8408v4df __builtin_ia32_divpd256 (v4df,v4df)
8409v8sf __builtin_ia32_divps256 (v8sf,v8sf)
8410v8sf __builtin_ia32_dpps256 (v8sf,v8sf,int)
8411v4df __builtin_ia32_haddpd256 (v4df,v4df)
8412v8sf __builtin_ia32_haddps256 (v8sf,v8sf)
8413v4df __builtin_ia32_hsubpd256 (v4df,v4df)
8414v8sf __builtin_ia32_hsubps256 (v8sf,v8sf)
8415v32qi __builtin_ia32_lddqu256 (pcchar)
8416v32qi __builtin_ia32_loaddqu256 (pcchar)
8417v4df __builtin_ia32_loadupd256 (pcdouble)
8418v8sf __builtin_ia32_loadups256 (pcfloat)
8419v2df __builtin_ia32_maskloadpd (pcv2df,v2df)
8420v4df __builtin_ia32_maskloadpd256 (pcv4df,v4df)
8421v4sf __builtin_ia32_maskloadps (pcv4sf,v4sf)
8422v8sf __builtin_ia32_maskloadps256 (pcv8sf,v8sf)
8423void __builtin_ia32_maskstorepd (pv2df,v2df,v2df)
8424void __builtin_ia32_maskstorepd256 (pv4df,v4df,v4df)
8425void __builtin_ia32_maskstoreps (pv4sf,v4sf,v4sf)
8426void __builtin_ia32_maskstoreps256 (pv8sf,v8sf,v8sf)
8427v4df __builtin_ia32_maxpd256 (v4df,v4df)
8428v8sf __builtin_ia32_maxps256 (v8sf,v8sf)
8429v4df __builtin_ia32_minpd256 (v4df,v4df)
8430v8sf __builtin_ia32_minps256 (v8sf,v8sf)
8431v4df __builtin_ia32_movddup256 (v4df)
8432int __builtin_ia32_movmskpd256 (v4df)
8433int __builtin_ia32_movmskps256 (v8sf)
8434v8sf __builtin_ia32_movshdup256 (v8sf)
8435v8sf __builtin_ia32_movsldup256 (v8sf)
8436v4df __builtin_ia32_mulpd256 (v4df,v4df)
8437v8sf __builtin_ia32_mulps256 (v8sf,v8sf)
8438v4df __builtin_ia32_orpd256 (v4df,v4df)
8439v8sf __builtin_ia32_orps256 (v8sf,v8sf)
8440v2df __builtin_ia32_pd_pd256 (v4df)
8441v4df __builtin_ia32_pd256_pd (v2df)
8442v4sf __builtin_ia32_ps_ps256 (v8sf)
8443v8sf __builtin_ia32_ps256_ps (v4sf)
8444int __builtin_ia32_ptestc256 (v4di,v4di,ptest)
8445int __builtin_ia32_ptestnzc256 (v4di,v4di,ptest)
8446int __builtin_ia32_ptestz256 (v4di,v4di,ptest)
8447v8sf __builtin_ia32_rcpps256 (v8sf)
8448v4df __builtin_ia32_roundpd256 (v4df,int)
8449v8sf __builtin_ia32_roundps256 (v8sf,int)
8450v8sf __builtin_ia32_rsqrtps_nr256 (v8sf)
8451v8sf __builtin_ia32_rsqrtps256 (v8sf)
8452v4df __builtin_ia32_shufpd256 (v4df,v4df,int)
8453v8sf __builtin_ia32_shufps256 (v8sf,v8sf,int)
8454v4si __builtin_ia32_si_si256 (v8si)
8455v8si __builtin_ia32_si256_si (v4si)
8456v4df __builtin_ia32_sqrtpd256 (v4df)
8457v8sf __builtin_ia32_sqrtps_nr256 (v8sf)
8458v8sf __builtin_ia32_sqrtps256 (v8sf)
8459void __builtin_ia32_storedqu256 (pchar,v32qi)
8460void __builtin_ia32_storeupd256 (pdouble,v4df)
8461void __builtin_ia32_storeups256 (pfloat,v8sf)
8462v4df __builtin_ia32_subpd256 (v4df,v4df)
8463v8sf __builtin_ia32_subps256 (v8sf,v8sf)
8464v4df __builtin_ia32_unpckhpd256 (v4df,v4df)
8465v8sf __builtin_ia32_unpckhps256 (v8sf,v8sf)
8466v4df __builtin_ia32_unpcklpd256 (v4df,v4df)
8467v8sf __builtin_ia32_unpcklps256 (v8sf,v8sf)
8468v4df __builtin_ia32_vbroadcastf128_pd256 (pcv2df)
8469v8sf __builtin_ia32_vbroadcastf128_ps256 (pcv4sf)
8470v4df __builtin_ia32_vbroadcastsd256 (pcdouble)
8471v4sf __builtin_ia32_vbroadcastss (pcfloat)
8472v8sf __builtin_ia32_vbroadcastss256 (pcfloat)
8473v2df __builtin_ia32_vextractf128_pd256 (v4df,int)
8474v4sf __builtin_ia32_vextractf128_ps256 (v8sf,int)
8475v4si __builtin_ia32_vextractf128_si256 (v8si,int)
8476v4df __builtin_ia32_vinsertf128_pd256 (v4df,v2df,int)
8477v8sf __builtin_ia32_vinsertf128_ps256 (v8sf,v4sf,int)
8478v8si __builtin_ia32_vinsertf128_si256 (v8si,v4si,int)
8479v4df __builtin_ia32_vperm2f128_pd256 (v4df,v4df,int)
8480v8sf __builtin_ia32_vperm2f128_ps256 (v8sf,v8sf,int)
8481v8si __builtin_ia32_vperm2f128_si256 (v8si,v8si,int)
8482v2df __builtin_ia32_vpermil2pd (v2df,v2df,v2di,int)
8483v4df __builtin_ia32_vpermil2pd256 (v4df,v4df,v4di,int)
8484v4sf __builtin_ia32_vpermil2ps (v4sf,v4sf,v4si,int)
8485v8sf __builtin_ia32_vpermil2ps256 (v8sf,v8sf,v8si,int)
8486v2df __builtin_ia32_vpermilpd (v2df,int)
8487v4df __builtin_ia32_vpermilpd256 (v4df,int)
8488v4sf __builtin_ia32_vpermilps (v4sf,int)
8489v8sf __builtin_ia32_vpermilps256 (v8sf,int)
8490v2df __builtin_ia32_vpermilvarpd (v2df,v2di)
8491v4df __builtin_ia32_vpermilvarpd256 (v4df,v4di)
8492v4sf __builtin_ia32_vpermilvarps (v4sf,v4si)
8493v8sf __builtin_ia32_vpermilvarps256 (v8sf,v8si)
8494int __builtin_ia32_vtestcpd (v2df,v2df,ptest)
8495int __builtin_ia32_vtestcpd256 (v4df,v4df,ptest)
8496int __builtin_ia32_vtestcps (v4sf,v4sf,ptest)
8497int __builtin_ia32_vtestcps256 (v8sf,v8sf,ptest)
8498int __builtin_ia32_vtestnzcpd (v2df,v2df,ptest)
8499int __builtin_ia32_vtestnzcpd256 (v4df,v4df,ptest)
8500int __builtin_ia32_vtestnzcps (v4sf,v4sf,ptest)
8501int __builtin_ia32_vtestnzcps256 (v8sf,v8sf,ptest)
8502int __builtin_ia32_vtestzpd (v2df,v2df,ptest)
8503int __builtin_ia32_vtestzpd256 (v4df,v4df,ptest)
8504int __builtin_ia32_vtestzps (v4sf,v4sf,ptest)
8505int __builtin_ia32_vtestzps256 (v8sf,v8sf,ptest)
8506void __builtin_ia32_vzeroall (void)
8507void __builtin_ia32_vzeroupper (void)
8508v4df __builtin_ia32_xorpd256 (v4df,v4df)
8509v8sf __builtin_ia32_xorps256 (v8sf,v8sf)
8510@end smallexample
8511
8b96a312
L
8512The following built-in functions are available when @option{-maes} is
8513used. All of them generate the machine instruction that is part of the
8514name.
8515
8516@smallexample
8517v2di __builtin_ia32_aesenc128 (v2di, v2di)
8518v2di __builtin_ia32_aesenclast128 (v2di, v2di)
8519v2di __builtin_ia32_aesdec128 (v2di, v2di)
8520v2di __builtin_ia32_aesdeclast128 (v2di, v2di)
8521v2di __builtin_ia32_aeskeygenassist128 (v2di, const int)
8522v2di __builtin_ia32_aesimc128 (v2di)
8523@end smallexample
8524
8525The following built-in function is available when @option{-mpclmul} is
8526used.
8527
8528@table @code
8529@item v2di __builtin_ia32_pclmulqdq128 (v2di, v2di, const int)
8530Generates the @code{pclmulqdq} machine instruction.
8531@end table
8532
21efb4d4 8533The following built-in functions are available when @option{-msse4a} is used.
291d9a2d 8534All of them generate the machine instruction that is part of the name.
21efb4d4
HJ
8535
8536@smallexample
291d9a2d
UB
8537void __builtin_ia32_movntsd (double *, v2df)
8538void __builtin_ia32_movntss (float *, v4sf)
8539v2di __builtin_ia32_extrq (v2di, v16qi)
8540v2di __builtin_ia32_extrqi (v2di, const unsigned int, const unsigned int)
8541v2di __builtin_ia32_insertq (v2di, v2di)
8542v2di __builtin_ia32_insertqi (v2di, v2di, const unsigned int, const unsigned int)
21efb4d4
HJ
8543@end smallexample
8544
04e1d06b
MM
8545The following built-in functions are available when @option{-msse5} is used.
8546All of them generate the machine instruction that is part of the name
8547with MMX registers.
8548
8549@smallexample
8550v2df __builtin_ia32_comeqpd (v2df, v2df)
8551v2df __builtin_ia32_comeqps (v2df, v2df)
8552v4sf __builtin_ia32_comeqsd (v4sf, v4sf)
8553v4sf __builtin_ia32_comeqss (v4sf, v4sf)
8554v2df __builtin_ia32_comfalsepd (v2df, v2df)
8555v2df __builtin_ia32_comfalseps (v2df, v2df)
8556v4sf __builtin_ia32_comfalsesd (v4sf, v4sf)
8557v4sf __builtin_ia32_comfalsess (v4sf, v4sf)
8558v2df __builtin_ia32_comgepd (v2df, v2df)
8559v2df __builtin_ia32_comgeps (v2df, v2df)
8560v4sf __builtin_ia32_comgesd (v4sf, v4sf)
8561v4sf __builtin_ia32_comgess (v4sf, v4sf)
8562v2df __builtin_ia32_comgtpd (v2df, v2df)
8563v2df __builtin_ia32_comgtps (v2df, v2df)
8564v4sf __builtin_ia32_comgtsd (v4sf, v4sf)
8565v4sf __builtin_ia32_comgtss (v4sf, v4sf)
8566v2df __builtin_ia32_comlepd (v2df, v2df)
8567v2df __builtin_ia32_comleps (v2df, v2df)
8568v4sf __builtin_ia32_comlesd (v4sf, v4sf)
8569v4sf __builtin_ia32_comless (v4sf, v4sf)
8570v2df __builtin_ia32_comltpd (v2df, v2df)
8571v2df __builtin_ia32_comltps (v2df, v2df)
8572v4sf __builtin_ia32_comltsd (v4sf, v4sf)
8573v4sf __builtin_ia32_comltss (v4sf, v4sf)
8574v2df __builtin_ia32_comnepd (v2df, v2df)
8575v2df __builtin_ia32_comneps (v2df, v2df)
8576v4sf __builtin_ia32_comnesd (v4sf, v4sf)
8577v4sf __builtin_ia32_comness (v4sf, v4sf)
8578v2df __builtin_ia32_comordpd (v2df, v2df)
8579v2df __builtin_ia32_comordps (v2df, v2df)
8580v4sf __builtin_ia32_comordsd (v4sf, v4sf)
8581v4sf __builtin_ia32_comordss (v4sf, v4sf)
8582v2df __builtin_ia32_comtruepd (v2df, v2df)
8583v2df __builtin_ia32_comtrueps (v2df, v2df)
8584v4sf __builtin_ia32_comtruesd (v4sf, v4sf)
8585v4sf __builtin_ia32_comtruess (v4sf, v4sf)
8586v2df __builtin_ia32_comueqpd (v2df, v2df)
8587v2df __builtin_ia32_comueqps (v2df, v2df)
8588v4sf __builtin_ia32_comueqsd (v4sf, v4sf)
8589v4sf __builtin_ia32_comueqss (v4sf, v4sf)
8590v2df __builtin_ia32_comugepd (v2df, v2df)
8591v2df __builtin_ia32_comugeps (v2df, v2df)
8592v4sf __builtin_ia32_comugesd (v4sf, v4sf)
8593v4sf __builtin_ia32_comugess (v4sf, v4sf)
8594v2df __builtin_ia32_comugtpd (v2df, v2df)
8595v2df __builtin_ia32_comugtps (v2df, v2df)
8596v4sf __builtin_ia32_comugtsd (v4sf, v4sf)
8597v4sf __builtin_ia32_comugtss (v4sf, v4sf)
8598v2df __builtin_ia32_comulepd (v2df, v2df)
8599v2df __builtin_ia32_comuleps (v2df, v2df)
8600v4sf __builtin_ia32_comulesd (v4sf, v4sf)
8601v4sf __builtin_ia32_comuless (v4sf, v4sf)
8602v2df __builtin_ia32_comultpd (v2df, v2df)
8603v2df __builtin_ia32_comultps (v2df, v2df)
8604v4sf __builtin_ia32_comultsd (v4sf, v4sf)
8605v4sf __builtin_ia32_comultss (v4sf, v4sf)
8606v2df __builtin_ia32_comunepd (v2df, v2df)
8607v2df __builtin_ia32_comuneps (v2df, v2df)
8608v4sf __builtin_ia32_comunesd (v4sf, v4sf)
8609v4sf __builtin_ia32_comuness (v4sf, v4sf)
8610v2df __builtin_ia32_comunordpd (v2df, v2df)
8611v2df __builtin_ia32_comunordps (v2df, v2df)
8612v4sf __builtin_ia32_comunordsd (v4sf, v4sf)
8613v4sf __builtin_ia32_comunordss (v4sf, v4sf)
8614v2df __builtin_ia32_fmaddpd (v2df, v2df, v2df)
8615v4sf __builtin_ia32_fmaddps (v4sf, v4sf, v4sf)
8616v2df __builtin_ia32_fmaddsd (v2df, v2df, v2df)
8617v4sf __builtin_ia32_fmaddss (v4sf, v4sf, v4sf)
8618v2df __builtin_ia32_fmsubpd (v2df, v2df, v2df)
8619v4sf __builtin_ia32_fmsubps (v4sf, v4sf, v4sf)
8620v2df __builtin_ia32_fmsubsd (v2df, v2df, v2df)
8621v4sf __builtin_ia32_fmsubss (v4sf, v4sf, v4sf)
8622v2df __builtin_ia32_fnmaddpd (v2df, v2df, v2df)
8623v4sf __builtin_ia32_fnmaddps (v4sf, v4sf, v4sf)
8624v2df __builtin_ia32_fnmaddsd (v2df, v2df, v2df)
8625v4sf __builtin_ia32_fnmaddss (v4sf, v4sf, v4sf)
8626v2df __builtin_ia32_fnmsubpd (v2df, v2df, v2df)
8627v4sf __builtin_ia32_fnmsubps (v4sf, v4sf, v4sf)
8628v2df __builtin_ia32_fnmsubsd (v2df, v2df, v2df)
8629v4sf __builtin_ia32_fnmsubss (v4sf, v4sf, v4sf)
8630v2df __builtin_ia32_frczpd (v2df)
8631v4sf __builtin_ia32_frczps (v4sf)
8632v2df __builtin_ia32_frczsd (v2df, v2df)
8633v4sf __builtin_ia32_frczss (v4sf, v4sf)
8634v2di __builtin_ia32_pcmov (v2di, v2di, v2di)
8635v2di __builtin_ia32_pcmov_v2di (v2di, v2di, v2di)
8636v4si __builtin_ia32_pcmov_v4si (v4si, v4si, v4si)
8637v8hi __builtin_ia32_pcmov_v8hi (v8hi, v8hi, v8hi)
8638v16qi __builtin_ia32_pcmov_v16qi (v16qi, v16qi, v16qi)
8639v2df __builtin_ia32_pcmov_v2df (v2df, v2df, v2df)
8640v4sf __builtin_ia32_pcmov_v4sf (v4sf, v4sf, v4sf)
8641v16qi __builtin_ia32_pcomeqb (v16qi, v16qi)
8642v8hi __builtin_ia32_pcomeqw (v8hi, v8hi)
8643v4si __builtin_ia32_pcomeqd (v4si, v4si)
8644v2di __builtin_ia32_pcomeqq (v2di, v2di)
8645v16qi __builtin_ia32_pcomequb (v16qi, v16qi)
8646v4si __builtin_ia32_pcomequd (v4si, v4si)
8647v2di __builtin_ia32_pcomequq (v2di, v2di)
8648v8hi __builtin_ia32_pcomequw (v8hi, v8hi)
8649v8hi __builtin_ia32_pcomeqw (v8hi, v8hi)
8650v16qi __builtin_ia32_pcomfalseb (v16qi, v16qi)
8651v4si __builtin_ia32_pcomfalsed (v4si, v4si)
8652v2di __builtin_ia32_pcomfalseq (v2di, v2di)
8653v16qi __builtin_ia32_pcomfalseub (v16qi, v16qi)
8654v4si __builtin_ia32_pcomfalseud (v4si, v4si)
8655v2di __builtin_ia32_pcomfalseuq (v2di, v2di)
8656v8hi __builtin_ia32_pcomfalseuw (v8hi, v8hi)
8657v8hi __builtin_ia32_pcomfalsew (v8hi, v8hi)
8658v16qi __builtin_ia32_pcomgeb (v16qi, v16qi)
8659v4si __builtin_ia32_pcomged (v4si, v4si)
8660v2di __builtin_ia32_pcomgeq (v2di, v2di)
8661v16qi __builtin_ia32_pcomgeub (v16qi, v16qi)
8662v4si __builtin_ia32_pcomgeud (v4si, v4si)
8663v2di __builtin_ia32_pcomgeuq (v2di, v2di)
8664v8hi __builtin_ia32_pcomgeuw (v8hi, v8hi)
8665v8hi __builtin_ia32_pcomgew (v8hi, v8hi)
8666v16qi __builtin_ia32_pcomgtb (v16qi, v16qi)
8667v4si __builtin_ia32_pcomgtd (v4si, v4si)
8668v2di __builtin_ia32_pcomgtq (v2di, v2di)
8669v16qi __builtin_ia32_pcomgtub (v16qi, v16qi)
8670v4si __builtin_ia32_pcomgtud (v4si, v4si)
8671v2di __builtin_ia32_pcomgtuq (v2di, v2di)
8672v8hi __builtin_ia32_pcomgtuw (v8hi, v8hi)
8673v8hi __builtin_ia32_pcomgtw (v8hi, v8hi)
8674v16qi __builtin_ia32_pcomleb (v16qi, v16qi)
8675v4si __builtin_ia32_pcomled (v4si, v4si)
8676v2di __builtin_ia32_pcomleq (v2di, v2di)
8677v16qi __builtin_ia32_pcomleub (v16qi, v16qi)
8678v4si __builtin_ia32_pcomleud (v4si, v4si)
8679v2di __builtin_ia32_pcomleuq (v2di, v2di)
8680v8hi __builtin_ia32_pcomleuw (v8hi, v8hi)
8681v8hi __builtin_ia32_pcomlew (v8hi, v8hi)
8682v16qi __builtin_ia32_pcomltb (v16qi, v16qi)
8683v4si __builtin_ia32_pcomltd (v4si, v4si)
8684v2di __builtin_ia32_pcomltq (v2di, v2di)
8685v16qi __builtin_ia32_pcomltub (v16qi, v16qi)
8686v4si __builtin_ia32_pcomltud (v4si, v4si)
8687v2di __builtin_ia32_pcomltuq (v2di, v2di)
8688v8hi __builtin_ia32_pcomltuw (v8hi, v8hi)
8689v8hi __builtin_ia32_pcomltw (v8hi, v8hi)
8690v16qi __builtin_ia32_pcomneb (v16qi, v16qi)
8691v4si __builtin_ia32_pcomned (v4si, v4si)
8692v2di __builtin_ia32_pcomneq (v2di, v2di)
8693v16qi __builtin_ia32_pcomneub (v16qi, v16qi)
8694v4si __builtin_ia32_pcomneud (v4si, v4si)
8695v2di __builtin_ia32_pcomneuq (v2di, v2di)
8696v8hi __builtin_ia32_pcomneuw (v8hi, v8hi)
8697v8hi __builtin_ia32_pcomnew (v8hi, v8hi)
8698v16qi __builtin_ia32_pcomtrueb (v16qi, v16qi)
8699v4si __builtin_ia32_pcomtrued (v4si, v4si)
8700v2di __builtin_ia32_pcomtrueq (v2di, v2di)
8701v16qi __builtin_ia32_pcomtrueub (v16qi, v16qi)
8702v4si __builtin_ia32_pcomtrueud (v4si, v4si)
8703v2di __builtin_ia32_pcomtrueuq (v2di, v2di)
8704v8hi __builtin_ia32_pcomtrueuw (v8hi, v8hi)
8705v8hi __builtin_ia32_pcomtruew (v8hi, v8hi)
8706v4df __builtin_ia32_permpd (v2df, v2df, v16qi)
8707v4sf __builtin_ia32_permps (v4sf, v4sf, v16qi)
8708v4si __builtin_ia32_phaddbd (v16qi)
8709v2di __builtin_ia32_phaddbq (v16qi)
8710v8hi __builtin_ia32_phaddbw (v16qi)
8711v2di __builtin_ia32_phadddq (v4si)
8712v4si __builtin_ia32_phaddubd (v16qi)
8713v2di __builtin_ia32_phaddubq (v16qi)
8714v8hi __builtin_ia32_phaddubw (v16qi)
8715v2di __builtin_ia32_phaddudq (v4si)
8716v4si __builtin_ia32_phadduwd (v8hi)
8717v2di __builtin_ia32_phadduwq (v8hi)
8718v4si __builtin_ia32_phaddwd (v8hi)
8719v2di __builtin_ia32_phaddwq (v8hi)
8720v8hi __builtin_ia32_phsubbw (v16qi)
8721v2di __builtin_ia32_phsubdq (v4si)
8722v4si __builtin_ia32_phsubwd (v8hi)
8723v4si __builtin_ia32_pmacsdd (v4si, v4si, v4si)
8724v2di __builtin_ia32_pmacsdqh (v4si, v4si, v2di)
8725v2di __builtin_ia32_pmacsdql (v4si, v4si, v2di)
8726v4si __builtin_ia32_pmacssdd (v4si, v4si, v4si)
8727v2di __builtin_ia32_pmacssdqh (v4si, v4si, v2di)
8728v2di __builtin_ia32_pmacssdql (v4si, v4si, v2di)
8729v4si __builtin_ia32_pmacsswd (v8hi, v8hi, v4si)
8730v8hi __builtin_ia32_pmacssww (v8hi, v8hi, v8hi)
8731v4si __builtin_ia32_pmacswd (v8hi, v8hi, v4si)
8732v8hi __builtin_ia32_pmacsww (v8hi, v8hi, v8hi)
8733v4si __builtin_ia32_pmadcsswd (v8hi, v8hi, v4si)
8734v4si __builtin_ia32_pmadcswd (v8hi, v8hi, v4si)
8735v16qi __builtin_ia32_pperm (v16qi, v16qi, v16qi)
8736v16qi __builtin_ia32_protb (v16qi, v16qi)
8737v4si __builtin_ia32_protd (v4si, v4si)
8738v2di __builtin_ia32_protq (v2di, v2di)
8739v8hi __builtin_ia32_protw (v8hi, v8hi)
8740v16qi __builtin_ia32_pshab (v16qi, v16qi)
8741v4si __builtin_ia32_pshad (v4si, v4si)
8742v2di __builtin_ia32_pshaq (v2di, v2di)
8743v8hi __builtin_ia32_pshaw (v8hi, v8hi)
8744v16qi __builtin_ia32_pshlb (v16qi, v16qi)
8745v4si __builtin_ia32_pshld (v4si, v4si)
8746v2di __builtin_ia32_pshlq (v2di, v2di)
8747v8hi __builtin_ia32_pshlw (v8hi, v8hi)
8748@end smallexample
8749
84fbffb2 8750The following builtin-in functions are available when @option{-msse5}
04e1d06b
MM
8751is used. The second argument must be an integer constant and generate
8752the machine instruction that is part of the name with the @samp{_imm}
8753suffix removed.
8754
8755@smallexample
8756v16qi __builtin_ia32_protb_imm (v16qi, int)
8757v4si __builtin_ia32_protd_imm (v4si, int)
8758v2di __builtin_ia32_protq_imm (v2di, int)
8759v8hi __builtin_ia32_protw_imm (v8hi, int)
8760@end smallexample
8761
0975678f
JM
8762The following built-in functions are available when @option{-m3dnow} is used.
8763All of them generate the machine instruction that is part of the name.
8764
3ab51846 8765@smallexample
0975678f
JM
8766void __builtin_ia32_femms (void)
8767v8qi __builtin_ia32_pavgusb (v8qi, v8qi)
8768v2si __builtin_ia32_pf2id (v2sf)
8769v2sf __builtin_ia32_pfacc (v2sf, v2sf)
8770v2sf __builtin_ia32_pfadd (v2sf, v2sf)
8771v2si __builtin_ia32_pfcmpeq (v2sf, v2sf)
8772v2si __builtin_ia32_pfcmpge (v2sf, v2sf)
8773v2si __builtin_ia32_pfcmpgt (v2sf, v2sf)
8774v2sf __builtin_ia32_pfmax (v2sf, v2sf)
8775v2sf __builtin_ia32_pfmin (v2sf, v2sf)
8776v2sf __builtin_ia32_pfmul (v2sf, v2sf)
8777v2sf __builtin_ia32_pfrcp (v2sf)
8778v2sf __builtin_ia32_pfrcpit1 (v2sf, v2sf)
8779v2sf __builtin_ia32_pfrcpit2 (v2sf, v2sf)
8780v2sf __builtin_ia32_pfrsqrt (v2sf)
8781v2sf __builtin_ia32_pfrsqrtit1 (v2sf, v2sf)
8782v2sf __builtin_ia32_pfsub (v2sf, v2sf)
8783v2sf __builtin_ia32_pfsubr (v2sf, v2sf)
8784v2sf __builtin_ia32_pi2fd (v2si)
8785v4hi __builtin_ia32_pmulhrw (v4hi, v4hi)
3ab51846 8786@end smallexample
0975678f
JM
8787
8788The following built-in functions are available when both @option{-m3dnow}
8789and @option{-march=athlon} are used. All of them generate the machine
8790instruction that is part of the name.
8791
3ab51846 8792@smallexample
0975678f
JM
8793v2si __builtin_ia32_pf2iw (v2sf)
8794v2sf __builtin_ia32_pfnacc (v2sf, v2sf)
8795v2sf __builtin_ia32_pfpnacc (v2sf, v2sf)
8796v2sf __builtin_ia32_pi2fw (v2si)
8797v2sf __builtin_ia32_pswapdsf (v2sf)
8798v2si __builtin_ia32_pswapdsi (v2si)
3ab51846 8799@end smallexample
0975678f 8800
118ea793
CF
8801@node MIPS DSP Built-in Functions
8802@subsection MIPS DSP Built-in Functions
8803
8804The MIPS DSP Application-Specific Extension (ASE) includes new
8805instructions that are designed to improve the performance of DSP and
8806media applications. It provides instructions that operate on packed
32041385 88078-bit/16-bit integer data, Q7, Q15 and Q31 fractional data.
118ea793
CF
8808
8809GCC supports MIPS DSP operations using both the generic
8810vector extensions (@pxref{Vector Extensions}) and a collection of
8811MIPS-specific built-in functions. Both kinds of support are
8812enabled by the @option{-mdsp} command-line option.
8813
32041385
CF
8814Revision 2 of the ASE was introduced in the second half of 2006.
8815This revision adds extra instructions to the original ASE, but is
8816otherwise backwards-compatible with it. You can select revision 2
8817using the command-line option @option{-mdspr2}; this option implies
8818@option{-mdsp}.
8819
1e27273f
CM
8820The SCOUNT and POS bits of the DSP control register are global. The
8821WRDSP, EXTPDP, EXTPDPV and MTHLIP instructions modify the SCOUNT and
8822POS bits. During optimization, the compiler will not delete these
8823instructions and it will not delete calls to functions containing
8824these instructions.
8825
118ea793
CF
8826At present, GCC only provides support for operations on 32-bit
8827vectors. The vector type associated with 8-bit integer data is
32041385
CF
8828usually called @code{v4i8}, the vector type associated with Q7
8829is usually called @code{v4q7}, the vector type associated with 16-bit
8830integer data is usually called @code{v2i16}, and the vector type
8831associated with Q15 is usually called @code{v2q15}. They can be
8832defined in C as follows:
118ea793
CF
8833
8834@smallexample
32041385
CF
8835typedef signed char v4i8 __attribute__ ((vector_size(4)));
8836typedef signed char v4q7 __attribute__ ((vector_size(4)));
8837typedef short v2i16 __attribute__ ((vector_size(4)));
118ea793
CF
8838typedef short v2q15 __attribute__ ((vector_size(4)));
8839@end smallexample
8840
32041385
CF
8841@code{v4i8}, @code{v4q7}, @code{v2i16} and @code{v2q15} values are
8842initialized in the same way as aggregates. For example:
118ea793
CF
8843
8844@smallexample
8845v4i8 a = @{1, 2, 3, 4@};
8846v4i8 b;
8847b = (v4i8) @{5, 6, 7, 8@};
8848
8849v2q15 c = @{0x0fcb, 0x3a75@};
8850v2q15 d;
8851d = (v2q15) @{0.1234 * 0x1.0p15, 0.4567 * 0x1.0p15@};
8852@end smallexample
8853
8854@emph{Note:} The CPU's endianness determines the order in which values
8855are packed. On little-endian targets, the first value is the least
8856significant and the last value is the most significant. The opposite
8857order applies to big-endian targets. For example, the code above will
8858set the lowest byte of @code{a} to @code{1} on little-endian targets
8859and @code{4} on big-endian targets.
8860
32041385 8861@emph{Note:} Q7, Q15 and Q31 values must be initialized with their integer
118ea793 8862representation. As shown in this example, the integer representation
32041385
CF
8863of a Q7 value can be obtained by multiplying the fractional value by
8864@code{0x1.0p7}. The equivalent for Q15 values is to multiply by
118ea793
CF
8865@code{0x1.0p15}. The equivalent for Q31 values is to multiply by
8866@code{0x1.0p31}.
8867
8868The table below lists the @code{v4i8} and @code{v2q15} operations for which
8869hardware support exists. @code{a} and @code{b} are @code{v4i8} values,
8870and @code{c} and @code{d} are @code{v2q15} values.
8871
8872@multitable @columnfractions .50 .50
8873@item C code @tab MIPS instruction
8874@item @code{a + b} @tab @code{addu.qb}
8875@item @code{c + d} @tab @code{addq.ph}
8876@item @code{a - b} @tab @code{subu.qb}
8877@item @code{c - d} @tab @code{subq.ph}
8878@end multitable
8879
32041385
CF
8880The table below lists the @code{v2i16} operation for which
8881hardware support exists for the DSP ASE REV 2. @code{e} and @code{f} are
8882@code{v2i16} values.
8883
8884@multitable @columnfractions .50 .50
8885@item C code @tab MIPS instruction
8886@item @code{e * f} @tab @code{mul.ph}
8887@end multitable
8888
118ea793
CF
8889It is easier to describe the DSP built-in functions if we first define
8890the following types:
8891
8892@smallexample
8893typedef int q31;
8894typedef int i32;
32041385 8895typedef unsigned int ui32;
118ea793
CF
8896typedef long long a64;
8897@end smallexample
8898
8899@code{q31} and @code{i32} are actually the same as @code{int}, but we
8900use @code{q31} to indicate a Q31 fractional value and @code{i32} to
8901indicate a 32-bit integer value. Similarly, @code{a64} is the same as
8902@code{long long}, but we use @code{a64} to indicate values that will
8903be placed in one of the four DSP accumulators (@code{$ac0},
8904@code{$ac1}, @code{$ac2} or @code{$ac3}).
8905
8906Also, some built-in functions prefer or require immediate numbers as
8907parameters, because the corresponding DSP instructions accept both immediate
8908numbers and register operands, or accept immediate numbers only. The
8909immediate parameters are listed as follows.
8910
8911@smallexample
32041385 8912imm0_3: 0 to 3.
118ea793
CF
8913imm0_7: 0 to 7.
8914imm0_15: 0 to 15.
8915imm0_31: 0 to 31.
8916imm0_63: 0 to 63.
8917imm0_255: 0 to 255.
8918imm_n32_31: -32 to 31.
8919imm_n512_511: -512 to 511.
8920@end smallexample
8921
8922The following built-in functions map directly to a particular MIPS DSP
8923instruction. Please refer to the architecture specification
8924for details on what each instruction does.
8925
8926@smallexample
8927v2q15 __builtin_mips_addq_ph (v2q15, v2q15)
8928v2q15 __builtin_mips_addq_s_ph (v2q15, v2q15)
8929q31 __builtin_mips_addq_s_w (q31, q31)
8930v4i8 __builtin_mips_addu_qb (v4i8, v4i8)
8931v4i8 __builtin_mips_addu_s_qb (v4i8, v4i8)
8932v2q15 __builtin_mips_subq_ph (v2q15, v2q15)
8933v2q15 __builtin_mips_subq_s_ph (v2q15, v2q15)
8934q31 __builtin_mips_subq_s_w (q31, q31)
8935v4i8 __builtin_mips_subu_qb (v4i8, v4i8)
8936v4i8 __builtin_mips_subu_s_qb (v4i8, v4i8)
8937i32 __builtin_mips_addsc (i32, i32)
8938i32 __builtin_mips_addwc (i32, i32)
8939i32 __builtin_mips_modsub (i32, i32)
8940i32 __builtin_mips_raddu_w_qb (v4i8)
8941v2q15 __builtin_mips_absq_s_ph (v2q15)
8942q31 __builtin_mips_absq_s_w (q31)
8943v4i8 __builtin_mips_precrq_qb_ph (v2q15, v2q15)
8944v2q15 __builtin_mips_precrq_ph_w (q31, q31)
8945v2q15 __builtin_mips_precrq_rs_ph_w (q31, q31)
8946v4i8 __builtin_mips_precrqu_s_qb_ph (v2q15, v2q15)
8947q31 __builtin_mips_preceq_w_phl (v2q15)
8948q31 __builtin_mips_preceq_w_phr (v2q15)
8949v2q15 __builtin_mips_precequ_ph_qbl (v4i8)
8950v2q15 __builtin_mips_precequ_ph_qbr (v4i8)
8951v2q15 __builtin_mips_precequ_ph_qbla (v4i8)
8952v2q15 __builtin_mips_precequ_ph_qbra (v4i8)
8953v2q15 __builtin_mips_preceu_ph_qbl (v4i8)
8954v2q15 __builtin_mips_preceu_ph_qbr (v4i8)
8955v2q15 __builtin_mips_preceu_ph_qbla (v4i8)
8956v2q15 __builtin_mips_preceu_ph_qbra (v4i8)
8957v4i8 __builtin_mips_shll_qb (v4i8, imm0_7)
8958v4i8 __builtin_mips_shll_qb (v4i8, i32)
8959v2q15 __builtin_mips_shll_ph (v2q15, imm0_15)
8960v2q15 __builtin_mips_shll_ph (v2q15, i32)
8961v2q15 __builtin_mips_shll_s_ph (v2q15, imm0_15)
8962v2q15 __builtin_mips_shll_s_ph (v2q15, i32)
8963q31 __builtin_mips_shll_s_w (q31, imm0_31)
8964q31 __builtin_mips_shll_s_w (q31, i32)
8965v4i8 __builtin_mips_shrl_qb (v4i8, imm0_7)
8966v4i8 __builtin_mips_shrl_qb (v4i8, i32)
8967v2q15 __builtin_mips_shra_ph (v2q15, imm0_15)
8968v2q15 __builtin_mips_shra_ph (v2q15, i32)
8969v2q15 __builtin_mips_shra_r_ph (v2q15, imm0_15)
8970v2q15 __builtin_mips_shra_r_ph (v2q15, i32)
8971q31 __builtin_mips_shra_r_w (q31, imm0_31)
8972q31 __builtin_mips_shra_r_w (q31, i32)
8973v2q15 __builtin_mips_muleu_s_ph_qbl (v4i8, v2q15)
8974v2q15 __builtin_mips_muleu_s_ph_qbr (v4i8, v2q15)
8975v2q15 __builtin_mips_mulq_rs_ph (v2q15, v2q15)
8976q31 __builtin_mips_muleq_s_w_phl (v2q15, v2q15)
8977q31 __builtin_mips_muleq_s_w_phr (v2q15, v2q15)
8978a64 __builtin_mips_dpau_h_qbl (a64, v4i8, v4i8)
8979a64 __builtin_mips_dpau_h_qbr (a64, v4i8, v4i8)
8980a64 __builtin_mips_dpsu_h_qbl (a64, v4i8, v4i8)
8981a64 __builtin_mips_dpsu_h_qbr (a64, v4i8, v4i8)
8982a64 __builtin_mips_dpaq_s_w_ph (a64, v2q15, v2q15)
8983a64 __builtin_mips_dpaq_sa_l_w (a64, q31, q31)
8984a64 __builtin_mips_dpsq_s_w_ph (a64, v2q15, v2q15)
8985a64 __builtin_mips_dpsq_sa_l_w (a64, q31, q31)
8986a64 __builtin_mips_mulsaq_s_w_ph (a64, v2q15, v2q15)
8987a64 __builtin_mips_maq_s_w_phl (a64, v2q15, v2q15)
8988a64 __builtin_mips_maq_s_w_phr (a64, v2q15, v2q15)
8989a64 __builtin_mips_maq_sa_w_phl (a64, v2q15, v2q15)
8990a64 __builtin_mips_maq_sa_w_phr (a64, v2q15, v2q15)
8991i32 __builtin_mips_bitrev (i32)
8992i32 __builtin_mips_insv (i32, i32)
8993v4i8 __builtin_mips_repl_qb (imm0_255)
8994v4i8 __builtin_mips_repl_qb (i32)
8995v2q15 __builtin_mips_repl_ph (imm_n512_511)
8996v2q15 __builtin_mips_repl_ph (i32)
8997void __builtin_mips_cmpu_eq_qb (v4i8, v4i8)
8998void __builtin_mips_cmpu_lt_qb (v4i8, v4i8)
8999void __builtin_mips_cmpu_le_qb (v4i8, v4i8)
9000i32 __builtin_mips_cmpgu_eq_qb (v4i8, v4i8)
9001i32 __builtin_mips_cmpgu_lt_qb (v4i8, v4i8)
9002i32 __builtin_mips_cmpgu_le_qb (v4i8, v4i8)
9003void __builtin_mips_cmp_eq_ph (v2q15, v2q15)
9004void __builtin_mips_cmp_lt_ph (v2q15, v2q15)
9005void __builtin_mips_cmp_le_ph (v2q15, v2q15)
9006v4i8 __builtin_mips_pick_qb (v4i8, v4i8)
9007v2q15 __builtin_mips_pick_ph (v2q15, v2q15)
9008v2q15 __builtin_mips_packrl_ph (v2q15, v2q15)
9009i32 __builtin_mips_extr_w (a64, imm0_31)
9010i32 __builtin_mips_extr_w (a64, i32)
9011i32 __builtin_mips_extr_r_w (a64, imm0_31)
9012i32 __builtin_mips_extr_s_h (a64, i32)
9013i32 __builtin_mips_extr_rs_w (a64, imm0_31)
9014i32 __builtin_mips_extr_rs_w (a64, i32)
9015i32 __builtin_mips_extr_s_h (a64, imm0_31)
9016i32 __builtin_mips_extr_r_w (a64, i32)
9017i32 __builtin_mips_extp (a64, imm0_31)
9018i32 __builtin_mips_extp (a64, i32)
9019i32 __builtin_mips_extpdp (a64, imm0_31)
9020i32 __builtin_mips_extpdp (a64, i32)
9021a64 __builtin_mips_shilo (a64, imm_n32_31)
9022a64 __builtin_mips_shilo (a64, i32)
9023a64 __builtin_mips_mthlip (a64, i32)
9024void __builtin_mips_wrdsp (i32, imm0_63)
9025i32 __builtin_mips_rddsp (imm0_63)
9026i32 __builtin_mips_lbux (void *, i32)
9027i32 __builtin_mips_lhx (void *, i32)
9028i32 __builtin_mips_lwx (void *, i32)
9029i32 __builtin_mips_bposge32 (void)
9030@end smallexample
9031
32041385
CF
9032The following built-in functions map directly to a particular MIPS DSP REV 2
9033instruction. Please refer to the architecture specification
9034for details on what each instruction does.
9035
9036@smallexample
9037v4q7 __builtin_mips_absq_s_qb (v4q7);
9038v2i16 __builtin_mips_addu_ph (v2i16, v2i16);
9039v2i16 __builtin_mips_addu_s_ph (v2i16, v2i16);
9040v4i8 __builtin_mips_adduh_qb (v4i8, v4i8);
9041v4i8 __builtin_mips_adduh_r_qb (v4i8, v4i8);
9042i32 __builtin_mips_append (i32, i32, imm0_31);
9043i32 __builtin_mips_balign (i32, i32, imm0_3);
9044i32 __builtin_mips_cmpgdu_eq_qb (v4i8, v4i8);
9045i32 __builtin_mips_cmpgdu_lt_qb (v4i8, v4i8);
9046i32 __builtin_mips_cmpgdu_le_qb (v4i8, v4i8);
9047a64 __builtin_mips_dpa_w_ph (a64, v2i16, v2i16);
9048a64 __builtin_mips_dps_w_ph (a64, v2i16, v2i16);
9049a64 __builtin_mips_madd (a64, i32, i32);
9050a64 __builtin_mips_maddu (a64, ui32, ui32);
9051a64 __builtin_mips_msub (a64, i32, i32);
9052a64 __builtin_mips_msubu (a64, ui32, ui32);
9053v2i16 __builtin_mips_mul_ph (v2i16, v2i16);
9054v2i16 __builtin_mips_mul_s_ph (v2i16, v2i16);
9055q31 __builtin_mips_mulq_rs_w (q31, q31);
9056v2q15 __builtin_mips_mulq_s_ph (v2q15, v2q15);
9057q31 __builtin_mips_mulq_s_w (q31, q31);
9058a64 __builtin_mips_mulsa_w_ph (a64, v2i16, v2i16);
9059a64 __builtin_mips_mult (i32, i32);
9060a64 __builtin_mips_multu (ui32, ui32);
9061v4i8 __builtin_mips_precr_qb_ph (v2i16, v2i16);
9062v2i16 __builtin_mips_precr_sra_ph_w (i32, i32, imm0_31);
9063v2i16 __builtin_mips_precr_sra_r_ph_w (i32, i32, imm0_31);
9064i32 __builtin_mips_prepend (i32, i32, imm0_31);
9065v4i8 __builtin_mips_shra_qb (v4i8, imm0_7);
9066v4i8 __builtin_mips_shra_r_qb (v4i8, imm0_7);
9067v4i8 __builtin_mips_shra_qb (v4i8, i32);
9068v4i8 __builtin_mips_shra_r_qb (v4i8, i32);
9069v2i16 __builtin_mips_shrl_ph (v2i16, imm0_15);
9070v2i16 __builtin_mips_shrl_ph (v2i16, i32);
9071v2i16 __builtin_mips_subu_ph (v2i16, v2i16);
9072v2i16 __builtin_mips_subu_s_ph (v2i16, v2i16);
9073v4i8 __builtin_mips_subuh_qb (v4i8, v4i8);
9074v4i8 __builtin_mips_subuh_r_qb (v4i8, v4i8);
9075v2q15 __builtin_mips_addqh_ph (v2q15, v2q15);
9076v2q15 __builtin_mips_addqh_r_ph (v2q15, v2q15);
9077q31 __builtin_mips_addqh_w (q31, q31);
9078q31 __builtin_mips_addqh_r_w (q31, q31);
9079v2q15 __builtin_mips_subqh_ph (v2q15, v2q15);
9080v2q15 __builtin_mips_subqh_r_ph (v2q15, v2q15);
9081q31 __builtin_mips_subqh_w (q31, q31);
9082q31 __builtin_mips_subqh_r_w (q31, q31);
9083a64 __builtin_mips_dpax_w_ph (a64, v2i16, v2i16);
9084a64 __builtin_mips_dpsx_w_ph (a64, v2i16, v2i16);
9085a64 __builtin_mips_dpaqx_s_w_ph (a64, v2q15, v2q15);
9086a64 __builtin_mips_dpaqx_sa_w_ph (a64, v2q15, v2q15);
9087a64 __builtin_mips_dpsqx_s_w_ph (a64, v2q15, v2q15);
9088a64 __builtin_mips_dpsqx_sa_w_ph (a64, v2q15, v2q15);
9089@end smallexample
9090
9091
d840bfd3
CF
9092@node MIPS Paired-Single Support
9093@subsection MIPS Paired-Single Support
9094
9095The MIPS64 architecture includes a number of instructions that
9096operate on pairs of single-precision floating-point values.
9097Each pair is packed into a 64-bit floating-point register,
9098with one element being designated the ``upper half'' and
9099the other being designated the ``lower half''.
9100
9101GCC supports paired-single operations using both the generic
9102vector extensions (@pxref{Vector Extensions}) and a collection of
9103MIPS-specific built-in functions. Both kinds of support are
9104enabled by the @option{-mpaired-single} command-line option.
9105
9106The vector type associated with paired-single values is usually
9107called @code{v2sf}. It can be defined in C as follows:
9108
9109@smallexample
9110typedef float v2sf __attribute__ ((vector_size (8)));
9111@end smallexample
9112
9113@code{v2sf} values are initialized in the same way as aggregates.
9114For example:
9115
9116@smallexample
9117v2sf a = @{1.5, 9.1@};
9118v2sf b;
9119float e, f;
9120b = (v2sf) @{e, f@};
9121@end smallexample
9122
9123@emph{Note:} The CPU's endianness determines which value is stored in
9124the upper half of a register and which value is stored in the lower half.
9125On little-endian targets, the first value is the lower one and the second
9126value is the upper one. The opposite order applies to big-endian targets.
9127For example, the code above will set the lower half of @code{a} to
9128@code{1.5} on little-endian targets and @code{9.1} on big-endian targets.
9129
93581857
MS
9130@node MIPS Loongson Built-in Functions
9131@subsection MIPS Loongson Built-in Functions
9132
9133GCC provides intrinsics to access the SIMD instructions provided by the
9134ST Microelectronics Loongson-2E and -2F processors. These intrinsics,
9135available after inclusion of the @code{loongson.h} header file,
9136operate on the following 64-bit vector types:
9137
9138@itemize
9139@item @code{uint8x8_t}, a vector of eight unsigned 8-bit integers;
9140@item @code{uint16x4_t}, a vector of four unsigned 16-bit integers;
9141@item @code{uint32x2_t}, a vector of two unsigned 32-bit integers;
9142@item @code{int8x8_t}, a vector of eight signed 8-bit integers;
9143@item @code{int16x4_t}, a vector of four signed 16-bit integers;
9144@item @code{int32x2_t}, a vector of two signed 32-bit integers.
9145@end itemize
9146
9147The intrinsics provided are listed below; each is named after the
9148machine instruction to which it corresponds, with suffixes added as
9149appropriate to distinguish intrinsics that expand to the same machine
9150instruction yet have different argument types. Refer to the architecture
9151documentation for a description of the functionality of each
9152instruction.
9153
9154@smallexample
9155int16x4_t packsswh (int32x2_t s, int32x2_t t);
9156int8x8_t packsshb (int16x4_t s, int16x4_t t);
9157uint8x8_t packushb (uint16x4_t s, uint16x4_t t);
9158uint32x2_t paddw_u (uint32x2_t s, uint32x2_t t);
9159uint16x4_t paddh_u (uint16x4_t s, uint16x4_t t);
9160uint8x8_t paddb_u (uint8x8_t s, uint8x8_t t);
9161int32x2_t paddw_s (int32x2_t s, int32x2_t t);
9162int16x4_t paddh_s (int16x4_t s, int16x4_t t);
9163int8x8_t paddb_s (int8x8_t s, int8x8_t t);
9164uint64_t paddd_u (uint64_t s, uint64_t t);
9165int64_t paddd_s (int64_t s, int64_t t);
9166int16x4_t paddsh (int16x4_t s, int16x4_t t);
9167int8x8_t paddsb (int8x8_t s, int8x8_t t);
9168uint16x4_t paddush (uint16x4_t s, uint16x4_t t);
9169uint8x8_t paddusb (uint8x8_t s, uint8x8_t t);
9170uint64_t pandn_ud (uint64_t s, uint64_t t);
9171uint32x2_t pandn_uw (uint32x2_t s, uint32x2_t t);
9172uint16x4_t pandn_uh (uint16x4_t s, uint16x4_t t);
9173uint8x8_t pandn_ub (uint8x8_t s, uint8x8_t t);
9174int64_t pandn_sd (int64_t s, int64_t t);
9175int32x2_t pandn_sw (int32x2_t s, int32x2_t t);
9176int16x4_t pandn_sh (int16x4_t s, int16x4_t t);
9177int8x8_t pandn_sb (int8x8_t s, int8x8_t t);
9178uint16x4_t pavgh (uint16x4_t s, uint16x4_t t);
9179uint8x8_t pavgb (uint8x8_t s, uint8x8_t t);
9180uint32x2_t pcmpeqw_u (uint32x2_t s, uint32x2_t t);
9181uint16x4_t pcmpeqh_u (uint16x4_t s, uint16x4_t t);
9182uint8x8_t pcmpeqb_u (uint8x8_t s, uint8x8_t t);
9183int32x2_t pcmpeqw_s (int32x2_t s, int32x2_t t);
9184int16x4_t pcmpeqh_s (int16x4_t s, int16x4_t t);
9185int8x8_t pcmpeqb_s (int8x8_t s, int8x8_t t);
9186uint32x2_t pcmpgtw_u (uint32x2_t s, uint32x2_t t);
9187uint16x4_t pcmpgth_u (uint16x4_t s, uint16x4_t t);
9188uint8x8_t pcmpgtb_u (uint8x8_t s, uint8x8_t t);
9189int32x2_t pcmpgtw_s (int32x2_t s, int32x2_t t);
9190int16x4_t pcmpgth_s (int16x4_t s, int16x4_t t);
9191int8x8_t pcmpgtb_s (int8x8_t s, int8x8_t t);
9192uint16x4_t pextrh_u (uint16x4_t s, int field);
9193int16x4_t pextrh_s (int16x4_t s, int field);
9194uint16x4_t pinsrh_0_u (uint16x4_t s, uint16x4_t t);
9195uint16x4_t pinsrh_1_u (uint16x4_t s, uint16x4_t t);
9196uint16x4_t pinsrh_2_u (uint16x4_t s, uint16x4_t t);
9197uint16x4_t pinsrh_3_u (uint16x4_t s, uint16x4_t t);
9198int16x4_t pinsrh_0_s (int16x4_t s, int16x4_t t);
9199int16x4_t pinsrh_1_s (int16x4_t s, int16x4_t t);
9200int16x4_t pinsrh_2_s (int16x4_t s, int16x4_t t);
9201int16x4_t pinsrh_3_s (int16x4_t s, int16x4_t t);
9202int32x2_t pmaddhw (int16x4_t s, int16x4_t t);
9203int16x4_t pmaxsh (int16x4_t s, int16x4_t t);
9204uint8x8_t pmaxub (uint8x8_t s, uint8x8_t t);
9205int16x4_t pminsh (int16x4_t s, int16x4_t t);
9206uint8x8_t pminub (uint8x8_t s, uint8x8_t t);
9207uint8x8_t pmovmskb_u (uint8x8_t s);
9208int8x8_t pmovmskb_s (int8x8_t s);
9209uint16x4_t pmulhuh (uint16x4_t s, uint16x4_t t);
9210int16x4_t pmulhh (int16x4_t s, int16x4_t t);
9211int16x4_t pmullh (int16x4_t s, int16x4_t t);
9212int64_t pmuluw (uint32x2_t s, uint32x2_t t);
9213uint8x8_t pasubub (uint8x8_t s, uint8x8_t t);
9214uint16x4_t biadd (uint8x8_t s);
9215uint16x4_t psadbh (uint8x8_t s, uint8x8_t t);
9216uint16x4_t pshufh_u (uint16x4_t dest, uint16x4_t s, uint8_t order);
9217int16x4_t pshufh_s (int16x4_t dest, int16x4_t s, uint8_t order);
9218uint16x4_t psllh_u (uint16x4_t s, uint8_t amount);
9219int16x4_t psllh_s (int16x4_t s, uint8_t amount);
9220uint32x2_t psllw_u (uint32x2_t s, uint8_t amount);
9221int32x2_t psllw_s (int32x2_t s, uint8_t amount);
9222uint16x4_t psrlh_u (uint16x4_t s, uint8_t amount);
9223int16x4_t psrlh_s (int16x4_t s, uint8_t amount);
9224uint32x2_t psrlw_u (uint32x2_t s, uint8_t amount);
9225int32x2_t psrlw_s (int32x2_t s, uint8_t amount);
9226uint16x4_t psrah_u (uint16x4_t s, uint8_t amount);
9227int16x4_t psrah_s (int16x4_t s, uint8_t amount);
9228uint32x2_t psraw_u (uint32x2_t s, uint8_t amount);
9229int32x2_t psraw_s (int32x2_t s, uint8_t amount);
9230uint32x2_t psubw_u (uint32x2_t s, uint32x2_t t);
9231uint16x4_t psubh_u (uint16x4_t s, uint16x4_t t);
9232uint8x8_t psubb_u (uint8x8_t s, uint8x8_t t);
9233int32x2_t psubw_s (int32x2_t s, int32x2_t t);
9234int16x4_t psubh_s (int16x4_t s, int16x4_t t);
9235int8x8_t psubb_s (int8x8_t s, int8x8_t t);
9236uint64_t psubd_u (uint64_t s, uint64_t t);
9237int64_t psubd_s (int64_t s, int64_t t);
9238int16x4_t psubsh (int16x4_t s, int16x4_t t);
9239int8x8_t psubsb (int8x8_t s, int8x8_t t);
9240uint16x4_t psubush (uint16x4_t s, uint16x4_t t);
9241uint8x8_t psubusb (uint8x8_t s, uint8x8_t t);
9242uint32x2_t punpckhwd_u (uint32x2_t s, uint32x2_t t);
9243uint16x4_t punpckhhw_u (uint16x4_t s, uint16x4_t t);
9244uint8x8_t punpckhbh_u (uint8x8_t s, uint8x8_t t);
9245int32x2_t punpckhwd_s (int32x2_t s, int32x2_t t);
9246int16x4_t punpckhhw_s (int16x4_t s, int16x4_t t);
9247int8x8_t punpckhbh_s (int8x8_t s, int8x8_t t);
9248uint32x2_t punpcklwd_u (uint32x2_t s, uint32x2_t t);
9249uint16x4_t punpcklhw_u (uint16x4_t s, uint16x4_t t);
9250uint8x8_t punpcklbh_u (uint8x8_t s, uint8x8_t t);
9251int32x2_t punpcklwd_s (int32x2_t s, int32x2_t t);
9252int16x4_t punpcklhw_s (int16x4_t s, int16x4_t t);
9253int8x8_t punpcklbh_s (int8x8_t s, int8x8_t t);
9254@end smallexample
9255
d840bfd3
CF
9256@menu
9257* Paired-Single Arithmetic::
9258* Paired-Single Built-in Functions::
9259* MIPS-3D Built-in Functions::
9260@end menu
9261
9262@node Paired-Single Arithmetic
9263@subsubsection Paired-Single Arithmetic
9264
9265The table below lists the @code{v2sf} operations for which hardware
9266support exists. @code{a}, @code{b} and @code{c} are @code{v2sf}
9267values and @code{x} is an integral value.
9268
9269@multitable @columnfractions .50 .50
9270@item C code @tab MIPS instruction
9271@item @code{a + b} @tab @code{add.ps}
9272@item @code{a - b} @tab @code{sub.ps}
9273@item @code{-a} @tab @code{neg.ps}
9274@item @code{a * b} @tab @code{mul.ps}
9275@item @code{a * b + c} @tab @code{madd.ps}
9276@item @code{a * b - c} @tab @code{msub.ps}
9277@item @code{-(a * b + c)} @tab @code{nmadd.ps}
9278@item @code{-(a * b - c)} @tab @code{nmsub.ps}
9279@item @code{x ? a : b} @tab @code{movn.ps}/@code{movz.ps}
9280@end multitable
9281
9282Note that the multiply-accumulate instructions can be disabled
9283using the command-line option @code{-mno-fused-madd}.
9284
9285@node Paired-Single Built-in Functions
9286@subsubsection Paired-Single Built-in Functions
9287
9288The following paired-single functions map directly to a particular
9289MIPS instruction. Please refer to the architecture specification
9290for details on what each instruction does.
9291
9292@table @code
9293@item v2sf __builtin_mips_pll_ps (v2sf, v2sf)
9294Pair lower lower (@code{pll.ps}).
9295
9296@item v2sf __builtin_mips_pul_ps (v2sf, v2sf)
9297Pair upper lower (@code{pul.ps}).
9298
9299@item v2sf __builtin_mips_plu_ps (v2sf, v2sf)
9300Pair lower upper (@code{plu.ps}).
9301
9302@item v2sf __builtin_mips_puu_ps (v2sf, v2sf)
9303Pair upper upper (@code{puu.ps}).
9304
9305@item v2sf __builtin_mips_cvt_ps_s (float, float)
9306Convert pair to paired single (@code{cvt.ps.s}).
9307
9308@item float __builtin_mips_cvt_s_pl (v2sf)
9309Convert pair lower to single (@code{cvt.s.pl}).
9310
9311@item float __builtin_mips_cvt_s_pu (v2sf)
9312Convert pair upper to single (@code{cvt.s.pu}).
9313
9314@item v2sf __builtin_mips_abs_ps (v2sf)
9315Absolute value (@code{abs.ps}).
9316
9317@item v2sf __builtin_mips_alnv_ps (v2sf, v2sf, int)
9318Align variable (@code{alnv.ps}).
9319
9320@emph{Note:} The value of the third parameter must be 0 or 4
9321modulo 8, otherwise the result will be unpredictable. Please read the
9322instruction description for details.
9323@end table
9324
9325The following multi-instruction functions are also available.
9326In each case, @var{cond} can be any of the 16 floating-point conditions:
9327@code{f}, @code{un}, @code{eq}, @code{ueq}, @code{olt}, @code{ult},
9328@code{ole}, @code{ule}, @code{sf}, @code{ngle}, @code{seq}, @code{ngl},
9329@code{lt}, @code{nge}, @code{le} or @code{ngt}.
9330
9331@table @code
9332@item v2sf __builtin_mips_movt_c_@var{cond}_ps (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9333@itemx v2sf __builtin_mips_movf_c_@var{cond}_ps (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9334Conditional move based on floating point comparison (@code{c.@var{cond}.ps},
9335@code{movt.ps}/@code{movf.ps}).
9336
9337The @code{movt} functions return the value @var{x} computed by:
9338
9339@smallexample
9340c.@var{cond}.ps @var{cc},@var{a},@var{b}
9341mov.ps @var{x},@var{c}
9342movt.ps @var{x},@var{d},@var{cc}
9343@end smallexample
9344
9345The @code{movf} functions are similar but use @code{movf.ps} instead
9346of @code{movt.ps}.
9347
9348@item int __builtin_mips_upper_c_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9349@itemx int __builtin_mips_lower_c_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9350Comparison of two paired-single values (@code{c.@var{cond}.ps},
9351@code{bc1t}/@code{bc1f}).
9352
9353These functions compare @var{a} and @var{b} using @code{c.@var{cond}.ps}
9354and return either the upper or lower half of the result. For example:
9355
9356@smallexample
9357v2sf a, b;
9358if (__builtin_mips_upper_c_eq_ps (a, b))
9359 upper_halves_are_equal ();
9360else
9361 upper_halves_are_unequal ();
9362
9363if (__builtin_mips_lower_c_eq_ps (a, b))
9364 lower_halves_are_equal ();
9365else
9366 lower_halves_are_unequal ();
9367@end smallexample
9368@end table
9369
9370@node MIPS-3D Built-in Functions
9371@subsubsection MIPS-3D Built-in Functions
9372
9373The MIPS-3D Application-Specific Extension (ASE) includes additional
9374paired-single instructions that are designed to improve the performance
9375of 3D graphics operations. Support for these instructions is controlled
9376by the @option{-mips3d} command-line option.
9377
9378The functions listed below map directly to a particular MIPS-3D
9379instruction. Please refer to the architecture specification for
9380more details on what each instruction does.
9381
9382@table @code
9383@item v2sf __builtin_mips_addr_ps (v2sf, v2sf)
9384Reduction add (@code{addr.ps}).
9385
9386@item v2sf __builtin_mips_mulr_ps (v2sf, v2sf)
9387Reduction multiply (@code{mulr.ps}).
9388
9389@item v2sf __builtin_mips_cvt_pw_ps (v2sf)
9390Convert paired single to paired word (@code{cvt.pw.ps}).
9391
9392@item v2sf __builtin_mips_cvt_ps_pw (v2sf)
9393Convert paired word to paired single (@code{cvt.ps.pw}).
9394
9395@item float __builtin_mips_recip1_s (float)
9396@itemx double __builtin_mips_recip1_d (double)
9397@itemx v2sf __builtin_mips_recip1_ps (v2sf)
9398Reduced precision reciprocal (sequence step 1) (@code{recip1.@var{fmt}}).
9399
9400@item float __builtin_mips_recip2_s (float, float)
9401@itemx double __builtin_mips_recip2_d (double, double)
9402@itemx v2sf __builtin_mips_recip2_ps (v2sf, v2sf)
9403Reduced precision reciprocal (sequence step 2) (@code{recip2.@var{fmt}}).
9404
9405@item float __builtin_mips_rsqrt1_s (float)
9406@itemx double __builtin_mips_rsqrt1_d (double)
9407@itemx v2sf __builtin_mips_rsqrt1_ps (v2sf)
9408Reduced precision reciprocal square root (sequence step 1)
9409(@code{rsqrt1.@var{fmt}}).
9410
9411@item float __builtin_mips_rsqrt2_s (float, float)
9412@itemx double __builtin_mips_rsqrt2_d (double, double)
9413@itemx v2sf __builtin_mips_rsqrt2_ps (v2sf, v2sf)
9414Reduced precision reciprocal square root (sequence step 2)
9415(@code{rsqrt2.@var{fmt}}).
9416@end table
9417
9418The following multi-instruction functions are also available.
9419In each case, @var{cond} can be any of the 16 floating-point conditions:
9420@code{f}, @code{un}, @code{eq}, @code{ueq}, @code{olt}, @code{ult},
9421@code{ole}, @code{ule}, @code{sf}, @code{ngle}, @code{seq},
9422@code{ngl}, @code{lt}, @code{nge}, @code{le} or @code{ngt}.
9423
9424@table @code
9425@item int __builtin_mips_cabs_@var{cond}_s (float @var{a}, float @var{b})
9426@itemx int __builtin_mips_cabs_@var{cond}_d (double @var{a}, double @var{b})
9427Absolute comparison of two scalar values (@code{cabs.@var{cond}.@var{fmt}},
9428@code{bc1t}/@code{bc1f}).
9429
9430These functions compare @var{a} and @var{b} using @code{cabs.@var{cond}.s}
9431or @code{cabs.@var{cond}.d} and return the result as a boolean value.
9432For example:
9433
9434@smallexample
9435float a, b;
9436if (__builtin_mips_cabs_eq_s (a, b))
9437 true ();
9438else
9439 false ();
9440@end smallexample
9441
9442@item int __builtin_mips_upper_cabs_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9443@itemx int __builtin_mips_lower_cabs_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9444Absolute comparison of two paired-single values (@code{cabs.@var{cond}.ps},
9445@code{bc1t}/@code{bc1f}).
9446
9447These functions compare @var{a} and @var{b} using @code{cabs.@var{cond}.ps}
9448and return either the upper or lower half of the result. For example:
9449
9450@smallexample
9451v2sf a, b;
9452if (__builtin_mips_upper_cabs_eq_ps (a, b))
9453 upper_halves_are_equal ();
9454else
9455 upper_halves_are_unequal ();
9456
9457if (__builtin_mips_lower_cabs_eq_ps (a, b))
9458 lower_halves_are_equal ();
9459else
9460 lower_halves_are_unequal ();
9461@end smallexample
9462
9463@item v2sf __builtin_mips_movt_cabs_@var{cond}_ps (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9464@itemx v2sf __builtin_mips_movf_cabs_@var{cond}_ps (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9465Conditional move based on absolute comparison (@code{cabs.@var{cond}.ps},
9466@code{movt.ps}/@code{movf.ps}).
9467
9468The @code{movt} functions return the value @var{x} computed by:
9469
9470@smallexample
9471cabs.@var{cond}.ps @var{cc},@var{a},@var{b}
9472mov.ps @var{x},@var{c}
9473movt.ps @var{x},@var{d},@var{cc}
9474@end smallexample
9475
9476The @code{movf} functions are similar but use @code{movf.ps} instead
9477of @code{movt.ps}.
9478
9479@item int __builtin_mips_any_c_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9480@itemx int __builtin_mips_all_c_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9481@itemx int __builtin_mips_any_cabs_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9482@itemx int __builtin_mips_all_cabs_@var{cond}_ps (v2sf @var{a}, v2sf @var{b})
9483Comparison of two paired-single values
9484(@code{c.@var{cond}.ps}/@code{cabs.@var{cond}.ps},
9485@code{bc1any2t}/@code{bc1any2f}).
9486
9487These functions compare @var{a} and @var{b} using @code{c.@var{cond}.ps}
9488or @code{cabs.@var{cond}.ps}. The @code{any} forms return true if either
9489result is true and the @code{all} forms return true if both results are true.
9490For example:
9491
9492@smallexample
9493v2sf a, b;
9494if (__builtin_mips_any_c_eq_ps (a, b))
9495 one_is_true ();
9496else
9497 both_are_false ();
9498
9499if (__builtin_mips_all_c_eq_ps (a, b))
9500 both_are_true ();
9501else
9502 one_is_false ();
9503@end smallexample
9504
9505@item int __builtin_mips_any_c_@var{cond}_4s (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9506@itemx int __builtin_mips_all_c_@var{cond}_4s (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9507@itemx int __builtin_mips_any_cabs_@var{cond}_4s (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9508@itemx int __builtin_mips_all_cabs_@var{cond}_4s (v2sf @var{a}, v2sf @var{b}, v2sf @var{c}, v2sf @var{d})
9509Comparison of four paired-single values
9510(@code{c.@var{cond}.ps}/@code{cabs.@var{cond}.ps},
9511@code{bc1any4t}/@code{bc1any4f}).
9512
9513These functions use @code{c.@var{cond}.ps} or @code{cabs.@var{cond}.ps}
9514to compare @var{a} with @var{b} and to compare @var{c} with @var{d}.
9515The @code{any} forms return true if any of the four results are true
9516and the @code{all} forms return true if all four results are true.
9517For example:
9518
9519@smallexample
9520v2sf a, b, c, d;
9521if (__builtin_mips_any_c_eq_4s (a, b, c, d))
9522 some_are_true ();
9523else
9524 all_are_false ();
9525
9526if (__builtin_mips_all_c_eq_4s (a, b, c, d))
9527 all_are_true ();
9528else
9529 some_are_false ();
9530@end smallexample
9531@end table
9532
358da97e
HS
9533@node picoChip Built-in Functions
9534@subsection picoChip Built-in Functions
9535
9536GCC provides an interface to selected machine instructions from the
9537picoChip instruction set.
9538
9539@table @code
9540@item int __builtin_sbc (int @var{value})
9541Sign bit count. Return the number of consecutive bits in @var{value}
9542which have the same value as the sign-bit. The result is the number of
9543leading sign bits minus one, giving the number of redundant sign bits in
9544@var{value}.
9545
9546@item int __builtin_byteswap (int @var{value})
9547Byte swap. Return the result of swapping the upper and lower bytes of
9548@var{value}.
9549
9550@item int __builtin_brev (int @var{value})
9551Bit reversal. Return the result of reversing the bits in
9552@var{value}. Bit 15 is swapped with bit 0, bit 14 is swapped with bit 1,
9553and so on.
9554
9555@item int __builtin_adds (int @var{x}, int @var{y})
9556Saturating addition. Return the result of adding @var{x} and @var{y},
9557storing the value 32767 if the result overflows.
9558
9559@item int __builtin_subs (int @var{x}, int @var{y})
9560Saturating subtraction. Return the result of subtracting @var{y} from
9561@var{x}, storing the value -32768 if the result overflows.
9562
9563@item void __builtin_halt (void)
9564Halt. The processor will stop execution. This built-in is useful for
9565implementing assertions.
9566
9567@end table
9568
4d210b07
RS
9569@node Other MIPS Built-in Functions
9570@subsection Other MIPS Built-in Functions
9571
9572GCC provides other MIPS-specific built-in functions:
9573
9574@table @code
9575@item void __builtin_mips_cache (int @var{op}, const volatile void *@var{addr})
9576Insert a @samp{cache} instruction with operands @var{op} and @var{addr}.
9577GCC defines the preprocessor macro @code{___GCC_HAVE_BUILTIN_MIPS_CACHE}
9578when this function is available.
9579@end table
9580
333c8841
AH
9581@node PowerPC AltiVec Built-in Functions
9582@subsection PowerPC AltiVec Built-in Functions
9583
b0b343db
JJ
9584GCC provides an interface for the PowerPC family of processors to access
9585the AltiVec operations described in Motorola's AltiVec Programming
9586Interface Manual. The interface is made available by including
9587@code{<altivec.h>} and using @option{-maltivec} and
9588@option{-mabi=altivec}. The interface supports the following vector
9589types.
333c8841 9590
b0b343db
JJ
9591@smallexample
9592vector unsigned char
9593vector signed char
9594vector bool char
333c8841 9595
b0b343db
JJ
9596vector unsigned short
9597vector signed short
9598vector bool short
9599vector pixel
9600
9601vector unsigned int
9602vector signed int
9603vector bool int
9604vector float
9605@end smallexample
9606
9607GCC's implementation of the high-level language interface available from
9608C and C++ code differs from Motorola's documentation in several ways.
9609
9610@itemize @bullet
9611
9612@item
9613A vector constant is a list of constant expressions within curly braces.
9614
9615@item
9616A vector initializer requires no cast if the vector constant is of the
9617same type as the variable it is initializing.
333c8841 9618
b0b343db 9619@item
5edea4c6
JJ
9620If @code{signed} or @code{unsigned} is omitted, the signedness of the
9621vector type is the default signedness of the base type. The default
9622varies depending on the operating system, so a portable program should
9623always specify the signedness.
4e6e4e4c
JJ
9624
9625@item
9626Compiling with @option{-maltivec} adds keywords @code{__vector},
5950c3c9
BE
9627@code{vector}, @code{__pixel}, @code{pixel}, @code{__bool} and
9628@code{bool}. When compiling ISO C, the context-sensitive substitution
9629of the keywords @code{vector}, @code{pixel} and @code{bool} is
9630disabled. To use them, you must include @code{<altivec.h>} instead.
4e6e4e4c
JJ
9631
9632@item
9633GCC allows using a @code{typedef} name as the type specifier for a
9634vector type.
b0b343db
JJ
9635
9636@item
9637For C, overloaded functions are implemented with macros so the following
9638does not work:
90989b26
AH
9639
9640@smallexample
8254cb45 9641 vec_add ((vector signed int)@{1, 2, 3, 4@}, foo);
90989b26
AH
9642@end smallexample
9643
b0b343db
JJ
9644Since @code{vec_add} is a macro, the vector constant in the example
9645is treated as four separate arguments. Wrap the entire argument in
9646parentheses for this to work.
9647@end itemize
90989b26 9648
ae4b4a02
AH
9649@emph{Note:} Only the @code{<altivec.h>} interface is supported.
9650Internally, GCC uses built-in functions to achieve the functionality in
9651the aforementioned header file, but they are not supported and are
9652subject to change without notice.
9653
b0b343db
JJ
9654The following interfaces are supported for the generic and specific
9655AltiVec operations and the AltiVec predicates. In cases where there
9656is a direct mapping between generic and specific operations, only the
9657generic names are shown here, although the specific operations can also
9658be used.
333c8841 9659
b0b343db
JJ
9660Arguments that are documented as @code{const int} require literal
9661integral values within the range required for that operation.
333c8841 9662
b0b343db
JJ
9663@smallexample
9664vector signed char vec_abs (vector signed char);
9665vector signed short vec_abs (vector signed short);
9666vector signed int vec_abs (vector signed int);
9667vector float vec_abs (vector float);
333c8841 9668
b0b343db
JJ
9669vector signed char vec_abss (vector signed char);
9670vector signed short vec_abss (vector signed short);
9671vector signed int vec_abss (vector signed int);
333c8841 9672
b0b343db
JJ
9673vector signed char vec_add (vector bool char, vector signed char);
9674vector signed char vec_add (vector signed char, vector bool char);
9675vector signed char vec_add (vector signed char, vector signed char);
9676vector unsigned char vec_add (vector bool char, vector unsigned char);
9677vector unsigned char vec_add (vector unsigned char, vector bool char);
924fcc4e
JM
9678vector unsigned char vec_add (vector unsigned char,
9679 vector unsigned char);
b0b343db
JJ
9680vector signed short vec_add (vector bool short, vector signed short);
9681vector signed short vec_add (vector signed short, vector bool short);
333c8841 9682vector signed short vec_add (vector signed short, vector signed short);
b0b343db 9683vector unsigned short vec_add (vector bool short,
924fcc4e
JM
9684 vector unsigned short);
9685vector unsigned short vec_add (vector unsigned short,
b0b343db 9686 vector bool short);
6e5bb5ad
JM
9687vector unsigned short vec_add (vector unsigned short,
9688 vector unsigned short);
b0b343db
JJ
9689vector signed int vec_add (vector bool int, vector signed int);
9690vector signed int vec_add (vector signed int, vector bool int);
333c8841 9691vector signed int vec_add (vector signed int, vector signed int);
b0b343db
JJ
9692vector unsigned int vec_add (vector bool int, vector unsigned int);
9693vector unsigned int vec_add (vector unsigned int, vector bool int);
333c8841
AH
9694vector unsigned int vec_add (vector unsigned int, vector unsigned int);
9695vector float vec_add (vector float, vector float);
9696
b0b343db
JJ
9697vector float vec_vaddfp (vector float, vector float);
9698
9699vector signed int vec_vadduwm (vector bool int, vector signed int);
9700vector signed int vec_vadduwm (vector signed int, vector bool int);
9701vector signed int vec_vadduwm (vector signed int, vector signed int);
9702vector unsigned int vec_vadduwm (vector bool int, vector unsigned int);
9703vector unsigned int vec_vadduwm (vector unsigned int, vector bool int);
9704vector unsigned int vec_vadduwm (vector unsigned int,
9705 vector unsigned int);
9706
9707vector signed short vec_vadduhm (vector bool short,
9708 vector signed short);
9709vector signed short vec_vadduhm (vector signed short,
9710 vector bool short);
9711vector signed short vec_vadduhm (vector signed short,
9712 vector signed short);
9713vector unsigned short vec_vadduhm (vector bool short,
9714 vector unsigned short);
9715vector unsigned short vec_vadduhm (vector unsigned short,
9716 vector bool short);
9717vector unsigned short vec_vadduhm (vector unsigned short,
9718 vector unsigned short);
9719
9720vector signed char vec_vaddubm (vector bool char, vector signed char);
9721vector signed char vec_vaddubm (vector signed char, vector bool char);
9722vector signed char vec_vaddubm (vector signed char, vector signed char);
9723vector unsigned char vec_vaddubm (vector bool char,
9724 vector unsigned char);
9725vector unsigned char vec_vaddubm (vector unsigned char,
9726 vector bool char);
9727vector unsigned char vec_vaddubm (vector unsigned char,
9728 vector unsigned char);
9729
333c8841
AH
9730vector unsigned int vec_addc (vector unsigned int, vector unsigned int);
9731
b0b343db
JJ
9732vector unsigned char vec_adds (vector bool char, vector unsigned char);
9733vector unsigned char vec_adds (vector unsigned char, vector bool char);
924fcc4e
JM
9734vector unsigned char vec_adds (vector unsigned char,
9735 vector unsigned char);
b0b343db
JJ
9736vector signed char vec_adds (vector bool char, vector signed char);
9737vector signed char vec_adds (vector signed char, vector bool char);
333c8841 9738vector signed char vec_adds (vector signed char, vector signed char);
b0b343db 9739vector unsigned short vec_adds (vector bool short,
924fcc4e
JM
9740 vector unsigned short);
9741vector unsigned short vec_adds (vector unsigned short,
b0b343db 9742 vector bool short);
6e5bb5ad
JM
9743vector unsigned short vec_adds (vector unsigned short,
9744 vector unsigned short);
b0b343db
JJ
9745vector signed short vec_adds (vector bool short, vector signed short);
9746vector signed short vec_adds (vector signed short, vector bool short);
333c8841 9747vector signed short vec_adds (vector signed short, vector signed short);
b0b343db
JJ
9748vector unsigned int vec_adds (vector bool int, vector unsigned int);
9749vector unsigned int vec_adds (vector unsigned int, vector bool int);
333c8841 9750vector unsigned int vec_adds (vector unsigned int, vector unsigned int);
b0b343db
JJ
9751vector signed int vec_adds (vector bool int, vector signed int);
9752vector signed int vec_adds (vector signed int, vector bool int);
333c8841
AH
9753vector signed int vec_adds (vector signed int, vector signed int);
9754
b0b343db
JJ
9755vector signed int vec_vaddsws (vector bool int, vector signed int);
9756vector signed int vec_vaddsws (vector signed int, vector bool int);
9757vector signed int vec_vaddsws (vector signed int, vector signed int);
9758
9759vector unsigned int vec_vadduws (vector bool int, vector unsigned int);
9760vector unsigned int vec_vadduws (vector unsigned int, vector bool int);
9761vector unsigned int vec_vadduws (vector unsigned int,
9762 vector unsigned int);
9763
9764vector signed short vec_vaddshs (vector bool short,
9765 vector signed short);
9766vector signed short vec_vaddshs (vector signed short,
9767 vector bool short);
9768vector signed short vec_vaddshs (vector signed short,
9769 vector signed short);
9770
9771vector unsigned short vec_vadduhs (vector bool short,
9772 vector unsigned short);
9773vector unsigned short vec_vadduhs (vector unsigned short,
9774 vector bool short);
9775vector unsigned short vec_vadduhs (vector unsigned short,
9776 vector unsigned short);
9777
9778vector signed char vec_vaddsbs (vector bool char, vector signed char);
9779vector signed char vec_vaddsbs (vector signed char, vector bool char);
9780vector signed char vec_vaddsbs (vector signed char, vector signed char);
9781
9782vector unsigned char vec_vaddubs (vector bool char,
9783 vector unsigned char);
9784vector unsigned char vec_vaddubs (vector unsigned char,
9785 vector bool char);
9786vector unsigned char vec_vaddubs (vector unsigned char,
9787 vector unsigned char);
9788
333c8841 9789vector float vec_and (vector float, vector float);
b0b343db
JJ
9790vector float vec_and (vector float, vector bool int);
9791vector float vec_and (vector bool int, vector float);
9792vector bool int vec_and (vector bool int, vector bool int);
9793vector signed int vec_and (vector bool int, vector signed int);
9794vector signed int vec_and (vector signed int, vector bool int);
333c8841 9795vector signed int vec_and (vector signed int, vector signed int);
b0b343db
JJ
9796vector unsigned int vec_and (vector bool int, vector unsigned int);
9797vector unsigned int vec_and (vector unsigned int, vector bool int);
333c8841 9798vector unsigned int vec_and (vector unsigned int, vector unsigned int);
b0b343db
JJ
9799vector bool short vec_and (vector bool short, vector bool short);
9800vector signed short vec_and (vector bool short, vector signed short);
9801vector signed short vec_and (vector signed short, vector bool short);
333c8841 9802vector signed short vec_and (vector signed short, vector signed short);
b0b343db 9803vector unsigned short vec_and (vector bool short,
924fcc4e
JM
9804 vector unsigned short);
9805vector unsigned short vec_and (vector unsigned short,
b0b343db 9806 vector bool short);
6e5bb5ad
JM
9807vector unsigned short vec_and (vector unsigned short,
9808 vector unsigned short);
b0b343db
JJ
9809vector signed char vec_and (vector bool char, vector signed char);
9810vector bool char vec_and (vector bool char, vector bool char);
9811vector signed char vec_and (vector signed char, vector bool char);
333c8841 9812vector signed char vec_and (vector signed char, vector signed char);
b0b343db
JJ
9813vector unsigned char vec_and (vector bool char, vector unsigned char);
9814vector unsigned char vec_and (vector unsigned char, vector bool char);
924fcc4e
JM
9815vector unsigned char vec_and (vector unsigned char,
9816 vector unsigned char);
333c8841
AH
9817
9818vector float vec_andc (vector float, vector float);
b0b343db
JJ
9819vector float vec_andc (vector float, vector bool int);
9820vector float vec_andc (vector bool int, vector float);
9821vector bool int vec_andc (vector bool int, vector bool int);
9822vector signed int vec_andc (vector bool int, vector signed int);
9823vector signed int vec_andc (vector signed int, vector bool int);
333c8841 9824vector signed int vec_andc (vector signed int, vector signed int);
b0b343db
JJ
9825vector unsigned int vec_andc (vector bool int, vector unsigned int);
9826vector unsigned int vec_andc (vector unsigned int, vector bool int);
333c8841 9827vector unsigned int vec_andc (vector unsigned int, vector unsigned int);
b0b343db
JJ
9828vector bool short vec_andc (vector bool short, vector bool short);
9829vector signed short vec_andc (vector bool short, vector signed short);
9830vector signed short vec_andc (vector signed short, vector bool short);
333c8841 9831vector signed short vec_andc (vector signed short, vector signed short);
b0b343db 9832vector unsigned short vec_andc (vector bool short,
924fcc4e
JM
9833 vector unsigned short);
9834vector unsigned short vec_andc (vector unsigned short,
b0b343db 9835 vector bool short);
6e5bb5ad
JM
9836vector unsigned short vec_andc (vector unsigned short,
9837 vector unsigned short);
b0b343db
JJ
9838vector signed char vec_andc (vector bool char, vector signed char);
9839vector bool char vec_andc (vector bool char, vector bool char);
9840vector signed char vec_andc (vector signed char, vector bool char);
333c8841 9841vector signed char vec_andc (vector signed char, vector signed char);
b0b343db
JJ
9842vector unsigned char vec_andc (vector bool char, vector unsigned char);
9843vector unsigned char vec_andc (vector unsigned char, vector bool char);
924fcc4e
JM
9844vector unsigned char vec_andc (vector unsigned char,
9845 vector unsigned char);
333c8841 9846
924fcc4e
JM
9847vector unsigned char vec_avg (vector unsigned char,
9848 vector unsigned char);
333c8841 9849vector signed char vec_avg (vector signed char, vector signed char);
6e5bb5ad
JM
9850vector unsigned short vec_avg (vector unsigned short,
9851 vector unsigned short);
333c8841
AH
9852vector signed short vec_avg (vector signed short, vector signed short);
9853vector unsigned int vec_avg (vector unsigned int, vector unsigned int);
9854vector signed int vec_avg (vector signed int, vector signed int);
9855
b0b343db
JJ
9856vector signed int vec_vavgsw (vector signed int, vector signed int);
9857
9858vector unsigned int vec_vavguw (vector unsigned int,
9859 vector unsigned int);
9860
9861vector signed short vec_vavgsh (vector signed short,
9862 vector signed short);
9863
9864vector unsigned short vec_vavguh (vector unsigned short,
9865 vector unsigned short);
9866
9867vector signed char vec_vavgsb (vector signed char, vector signed char);
9868
9869vector unsigned char vec_vavgub (vector unsigned char,
9870 vector unsigned char);
9871
333c8841
AH
9872vector float vec_ceil (vector float);
9873
9874vector signed int vec_cmpb (vector float, vector float);
9875
b0b343db
JJ
9876vector bool char vec_cmpeq (vector signed char, vector signed char);
9877vector bool char vec_cmpeq (vector unsigned char, vector unsigned char);
9878vector bool short vec_cmpeq (vector signed short, vector signed short);
9879vector bool short vec_cmpeq (vector unsigned short,
9880 vector unsigned short);
9881vector bool int vec_cmpeq (vector signed int, vector signed int);
9882vector bool int vec_cmpeq (vector unsigned int, vector unsigned int);
9883vector bool int vec_cmpeq (vector float, vector float);
333c8841 9884
b0b343db 9885vector bool int vec_vcmpeqfp (vector float, vector float);
333c8841 9886
b0b343db
JJ
9887vector bool int vec_vcmpequw (vector signed int, vector signed int);
9888vector bool int vec_vcmpequw (vector unsigned int, vector unsigned int);
9889
9890vector bool short vec_vcmpequh (vector signed short,
9891 vector signed short);
9892vector bool short vec_vcmpequh (vector unsigned short,
9893 vector unsigned short);
333c8841 9894
b0b343db
JJ
9895vector bool char vec_vcmpequb (vector signed char, vector signed char);
9896vector bool char vec_vcmpequb (vector unsigned char,
9897 vector unsigned char);
333c8841 9898
b0b343db 9899vector bool int vec_cmpge (vector float, vector float);
333c8841 9900
b0b343db
JJ
9901vector bool char vec_cmpgt (vector unsigned char, vector unsigned char);
9902vector bool char vec_cmpgt (vector signed char, vector signed char);
9903vector bool short vec_cmpgt (vector unsigned short,
9904 vector unsigned short);
9905vector bool short vec_cmpgt (vector signed short, vector signed short);
9906vector bool int vec_cmpgt (vector unsigned int, vector unsigned int);
9907vector bool int vec_cmpgt (vector signed int, vector signed int);
9908vector bool int vec_cmpgt (vector float, vector float);
9909
9910vector bool int vec_vcmpgtfp (vector float, vector float);
9911
9912vector bool int vec_vcmpgtsw (vector signed int, vector signed int);
9913
9914vector bool int vec_vcmpgtuw (vector unsigned int, vector unsigned int);
333c8841 9915
b0b343db
JJ
9916vector bool short vec_vcmpgtsh (vector signed short,
9917 vector signed short);
9918
9919vector bool short vec_vcmpgtuh (vector unsigned short,
9920 vector unsigned short);
9921
9922vector bool char vec_vcmpgtsb (vector signed char, vector signed char);
9923
9924vector bool char vec_vcmpgtub (vector unsigned char,
9925 vector unsigned char);
9926
9927vector bool int vec_cmple (vector float, vector float);
9928
9929vector bool char vec_cmplt (vector unsigned char, vector unsigned char);
9930vector bool char vec_cmplt (vector signed char, vector signed char);
9931vector bool short vec_cmplt (vector unsigned short,
9932 vector unsigned short);
9933vector bool short vec_cmplt (vector signed short, vector signed short);
9934vector bool int vec_cmplt (vector unsigned int, vector unsigned int);
9935vector bool int vec_cmplt (vector signed int, vector signed int);
9936vector bool int vec_cmplt (vector float, vector float);
333c8841 9937
b0b343db
JJ
9938vector float vec_ctf (vector unsigned int, const int);
9939vector float vec_ctf (vector signed int, const int);
333c8841 9940
b0b343db
JJ
9941vector float vec_vcfsx (vector signed int, const int);
9942
9943vector float vec_vcfux (vector unsigned int, const int);
9944
9945vector signed int vec_cts (vector float, const int);
9946
9947vector unsigned int vec_ctu (vector float, const int);
9948
9949void vec_dss (const int);
333c8841
AH
9950
9951void vec_dssall (void);
9952
b0b343db
JJ
9953void vec_dst (const vector unsigned char *, int, const int);
9954void vec_dst (const vector signed char *, int, const int);
9955void vec_dst (const vector bool char *, int, const int);
9956void vec_dst (const vector unsigned short *, int, const int);
9957void vec_dst (const vector signed short *, int, const int);
9958void vec_dst (const vector bool short *, int, const int);
9959void vec_dst (const vector pixel *, int, const int);
9960void vec_dst (const vector unsigned int *, int, const int);
9961void vec_dst (const vector signed int *, int, const int);
9962void vec_dst (const vector bool int *, int, const int);
9963void vec_dst (const vector float *, int, const int);
9964void vec_dst (const unsigned char *, int, const int);
9965void vec_dst (const signed char *, int, const int);
9966void vec_dst (const unsigned short *, int, const int);
9967void vec_dst (const short *, int, const int);
9968void vec_dst (const unsigned int *, int, const int);
9969void vec_dst (const int *, int, const int);
9970void vec_dst (const unsigned long *, int, const int);
9971void vec_dst (const long *, int, const int);
9972void vec_dst (const float *, int, const int);
9973
9974void vec_dstst (const vector unsigned char *, int, const int);
9975void vec_dstst (const vector signed char *, int, const int);
9976void vec_dstst (const vector bool char *, int, const int);
9977void vec_dstst (const vector unsigned short *, int, const int);
9978void vec_dstst (const vector signed short *, int, const int);
9979void vec_dstst (const vector bool short *, int, const int);
9980void vec_dstst (const vector pixel *, int, const int);
9981void vec_dstst (const vector unsigned int *, int, const int);
9982void vec_dstst (const vector signed int *, int, const int);
9983void vec_dstst (const vector bool int *, int, const int);
9984void vec_dstst (const vector float *, int, const int);
9985void vec_dstst (const unsigned char *, int, const int);
9986void vec_dstst (const signed char *, int, const int);
9987void vec_dstst (const unsigned short *, int, const int);
9988void vec_dstst (const short *, int, const int);
9989void vec_dstst (const unsigned int *, int, const int);
9990void vec_dstst (const int *, int, const int);
9991void vec_dstst (const unsigned long *, int, const int);
9992void vec_dstst (const long *, int, const int);
9993void vec_dstst (const float *, int, const int);
9994
9995void vec_dststt (const vector unsigned char *, int, const int);
9996void vec_dststt (const vector signed char *, int, const int);
9997void vec_dststt (const vector bool char *, int, const int);
9998void vec_dststt (const vector unsigned short *, int, const int);
9999void vec_dststt (const vector signed short *, int, const int);
10000void vec_dststt (const vector bool short *, int, const int);
10001void vec_dststt (const vector pixel *, int, const int);
10002void vec_dststt (const vector unsigned int *, int, const int);
10003void vec_dststt (const vector signed int *, int, const int);
10004void vec_dststt (const vector bool int *, int, const int);
10005void vec_dststt (const vector float *, int, const int);
10006void vec_dststt (const unsigned char *, int, const int);
10007void vec_dststt (const signed char *, int, const int);
10008void vec_dststt (const unsigned short *, int, const int);
10009void vec_dststt (const short *, int, const int);
10010void vec_dststt (const unsigned int *, int, const int);
10011void vec_dststt (const int *, int, const int);
10012void vec_dststt (const unsigned long *, int, const int);
10013void vec_dststt (const long *, int, const int);
10014void vec_dststt (const float *, int, const int);
10015
10016void vec_dstt (const vector unsigned char *, int, const int);
10017void vec_dstt (const vector signed char *, int, const int);
10018void vec_dstt (const vector bool char *, int, const int);
10019void vec_dstt (const vector unsigned short *, int, const int);
10020void vec_dstt (const vector signed short *, int, const int);
10021void vec_dstt (const vector bool short *, int, const int);
10022void vec_dstt (const vector pixel *, int, const int);
10023void vec_dstt (const vector unsigned int *, int, const int);
10024void vec_dstt (const vector signed int *, int, const int);
10025void vec_dstt (const vector bool int *, int, const int);
10026void vec_dstt (const vector float *, int, const int);
10027void vec_dstt (const unsigned char *, int, const int);
10028void vec_dstt (const signed char *, int, const int);
10029void vec_dstt (const unsigned short *, int, const int);
10030void vec_dstt (const short *, int, const int);
10031void vec_dstt (const unsigned int *, int, const int);
10032void vec_dstt (const int *, int, const int);
10033void vec_dstt (const unsigned long *, int, const int);
10034void vec_dstt (const long *, int, const int);
10035void vec_dstt (const float *, int, const int);
10036
10037vector float vec_expte (vector float);
10038
10039vector float vec_floor (vector float);
10040
10041vector float vec_ld (int, const vector float *);
10042vector float vec_ld (int, const float *);
10043vector bool int vec_ld (int, const vector bool int *);
10044vector signed int vec_ld (int, const vector signed int *);
10045vector signed int vec_ld (int, const int *);
10046vector signed int vec_ld (int, const long *);
10047vector unsigned int vec_ld (int, const vector unsigned int *);
10048vector unsigned int vec_ld (int, const unsigned int *);
10049vector unsigned int vec_ld (int, const unsigned long *);
10050vector bool short vec_ld (int, const vector bool short *);
10051vector pixel vec_ld (int, const vector pixel *);
10052vector signed short vec_ld (int, const vector signed short *);
10053vector signed short vec_ld (int, const short *);
10054vector unsigned short vec_ld (int, const vector unsigned short *);
10055vector unsigned short vec_ld (int, const unsigned short *);
10056vector bool char vec_ld (int, const vector bool char *);
10057vector signed char vec_ld (int, const vector signed char *);
10058vector signed char vec_ld (int, const signed char *);
10059vector unsigned char vec_ld (int, const vector unsigned char *);
10060vector unsigned char vec_ld (int, const unsigned char *);
10061
10062vector signed char vec_lde (int, const signed char *);
10063vector unsigned char vec_lde (int, const unsigned char *);
10064vector signed short vec_lde (int, const short *);
10065vector unsigned short vec_lde (int, const unsigned short *);
10066vector float vec_lde (int, const float *);
10067vector signed int vec_lde (int, const int *);
10068vector unsigned int vec_lde (int, const unsigned int *);
10069vector signed int vec_lde (int, const long *);
10070vector unsigned int vec_lde (int, const unsigned long *);
10071
10072vector float vec_lvewx (int, float *);
10073vector signed int vec_lvewx (int, int *);
10074vector unsigned int vec_lvewx (int, unsigned int *);
10075vector signed int vec_lvewx (int, long *);
10076vector unsigned int vec_lvewx (int, unsigned long *);
10077
10078vector signed short vec_lvehx (int, short *);
10079vector unsigned short vec_lvehx (int, unsigned short *);
10080
10081vector signed char vec_lvebx (int, char *);
10082vector unsigned char vec_lvebx (int, unsigned char *);
10083
10084vector float vec_ldl (int, const vector float *);
10085vector float vec_ldl (int, const float *);
10086vector bool int vec_ldl (int, const vector bool int *);
10087vector signed int vec_ldl (int, const vector signed int *);
10088vector signed int vec_ldl (int, const int *);
10089vector signed int vec_ldl (int, const long *);
10090vector unsigned int vec_ldl (int, const vector unsigned int *);
10091vector unsigned int vec_ldl (int, const unsigned int *);
10092vector unsigned int vec_ldl (int, const unsigned long *);
10093vector bool short vec_ldl (int, const vector bool short *);
10094vector pixel vec_ldl (int, const vector pixel *);
10095vector signed short vec_ldl (int, const vector signed short *);
10096vector signed short vec_ldl (int, const short *);
10097vector unsigned short vec_ldl (int, const vector unsigned short *);
10098vector unsigned short vec_ldl (int, const unsigned short *);
10099vector bool char vec_ldl (int, const vector bool char *);
10100vector signed char vec_ldl (int, const vector signed char *);
10101vector signed char vec_ldl (int, const signed char *);
10102vector unsigned char vec_ldl (int, const vector unsigned char *);
10103vector unsigned char vec_ldl (int, const unsigned char *);
333c8841
AH
10104
10105vector float vec_loge (vector float);
10106
b0b343db
JJ
10107vector unsigned char vec_lvsl (int, const volatile unsigned char *);
10108vector unsigned char vec_lvsl (int, const volatile signed char *);
10109vector unsigned char vec_lvsl (int, const volatile unsigned short *);
10110vector unsigned char vec_lvsl (int, const volatile short *);
10111vector unsigned char vec_lvsl (int, const volatile unsigned int *);
10112vector unsigned char vec_lvsl (int, const volatile int *);
10113vector unsigned char vec_lvsl (int, const volatile unsigned long *);
10114vector unsigned char vec_lvsl (int, const volatile long *);
10115vector unsigned char vec_lvsl (int, const volatile float *);
10116
10117vector unsigned char vec_lvsr (int, const volatile unsigned char *);
10118vector unsigned char vec_lvsr (int, const volatile signed char *);
10119vector unsigned char vec_lvsr (int, const volatile unsigned short *);
10120vector unsigned char vec_lvsr (int, const volatile short *);
10121vector unsigned char vec_lvsr (int, const volatile unsigned int *);
10122vector unsigned char vec_lvsr (int, const volatile int *);
10123vector unsigned char vec_lvsr (int, const volatile unsigned long *);
10124vector unsigned char vec_lvsr (int, const volatile long *);
10125vector unsigned char vec_lvsr (int, const volatile float *);
333c8841
AH
10126
10127vector float vec_madd (vector float, vector float, vector float);
10128
b0b343db
JJ
10129vector signed short vec_madds (vector signed short,
10130 vector signed short,
6e5bb5ad 10131 vector signed short);
333c8841 10132
b0b343db
JJ
10133vector unsigned char vec_max (vector bool char, vector unsigned char);
10134vector unsigned char vec_max (vector unsigned char, vector bool char);
924fcc4e
JM
10135vector unsigned char vec_max (vector unsigned char,
10136 vector unsigned char);
b0b343db
JJ
10137vector signed char vec_max (vector bool char, vector signed char);
10138vector signed char vec_max (vector signed char, vector bool char);
333c8841 10139vector signed char vec_max (vector signed char, vector signed char);
b0b343db 10140vector unsigned short vec_max (vector bool short,
924fcc4e
JM
10141 vector unsigned short);
10142vector unsigned short vec_max (vector unsigned short,
b0b343db 10143 vector bool short);
6e5bb5ad
JM
10144vector unsigned short vec_max (vector unsigned short,
10145 vector unsigned short);
b0b343db
JJ
10146vector signed short vec_max (vector bool short, vector signed short);
10147vector signed short vec_max (vector signed short, vector bool short);
333c8841 10148vector signed short vec_max (vector signed short, vector signed short);
b0b343db
JJ
10149vector unsigned int vec_max (vector bool int, vector unsigned int);
10150vector unsigned int vec_max (vector unsigned int, vector bool int);
333c8841 10151vector unsigned int vec_max (vector unsigned int, vector unsigned int);
b0b343db
JJ
10152vector signed int vec_max (vector bool int, vector signed int);
10153vector signed int vec_max (vector signed int, vector bool int);
333c8841
AH
10154vector signed int vec_max (vector signed int, vector signed int);
10155vector float vec_max (vector float, vector float);
10156
b0b343db
JJ
10157vector float vec_vmaxfp (vector float, vector float);
10158
10159vector signed int vec_vmaxsw (vector bool int, vector signed int);
10160vector signed int vec_vmaxsw (vector signed int, vector bool int);
10161vector signed int vec_vmaxsw (vector signed int, vector signed int);
10162
10163vector unsigned int vec_vmaxuw (vector bool int, vector unsigned int);
10164vector unsigned int vec_vmaxuw (vector unsigned int, vector bool int);
10165vector unsigned int vec_vmaxuw (vector unsigned int,
10166 vector unsigned int);
10167
10168vector signed short vec_vmaxsh (vector bool short, vector signed short);
10169vector signed short vec_vmaxsh (vector signed short, vector bool short);
10170vector signed short vec_vmaxsh (vector signed short,
10171 vector signed short);
10172
10173vector unsigned short vec_vmaxuh (vector bool short,
10174 vector unsigned short);
10175vector unsigned short vec_vmaxuh (vector unsigned short,
10176 vector bool short);
10177vector unsigned short vec_vmaxuh (vector unsigned short,
10178 vector unsigned short);
10179
10180vector signed char vec_vmaxsb (vector bool char, vector signed char);
10181vector signed char vec_vmaxsb (vector signed char, vector bool char);
10182vector signed char vec_vmaxsb (vector signed char, vector signed char);
10183
10184vector unsigned char vec_vmaxub (vector bool char,
10185 vector unsigned char);
10186vector unsigned char vec_vmaxub (vector unsigned char,
10187 vector bool char);
10188vector unsigned char vec_vmaxub (vector unsigned char,
10189 vector unsigned char);
10190
10191vector bool char vec_mergeh (vector bool char, vector bool char);
333c8841 10192vector signed char vec_mergeh (vector signed char, vector signed char);
6e5bb5ad
JM
10193vector unsigned char vec_mergeh (vector unsigned char,
10194 vector unsigned char);
b0b343db
JJ
10195vector bool short vec_mergeh (vector bool short, vector bool short);
10196vector pixel vec_mergeh (vector pixel, vector pixel);
924fcc4e
JM
10197vector signed short vec_mergeh (vector signed short,
10198 vector signed short);
6e5bb5ad
JM
10199vector unsigned short vec_mergeh (vector unsigned short,
10200 vector unsigned short);
333c8841 10201vector float vec_mergeh (vector float, vector float);
b0b343db 10202vector bool int vec_mergeh (vector bool int, vector bool int);
333c8841 10203vector signed int vec_mergeh (vector signed int, vector signed int);
924fcc4e
JM
10204vector unsigned int vec_mergeh (vector unsigned int,
10205 vector unsigned int);
333c8841 10206
b0b343db
JJ
10207vector float vec_vmrghw (vector float, vector float);
10208vector bool int vec_vmrghw (vector bool int, vector bool int);
10209vector signed int vec_vmrghw (vector signed int, vector signed int);
10210vector unsigned int vec_vmrghw (vector unsigned int,
10211 vector unsigned int);
10212
10213vector bool short vec_vmrghh (vector bool short, vector bool short);
10214vector signed short vec_vmrghh (vector signed short,
10215 vector signed short);
10216vector unsigned short vec_vmrghh (vector unsigned short,
10217 vector unsigned short);
10218vector pixel vec_vmrghh (vector pixel, vector pixel);
10219
10220vector bool char vec_vmrghb (vector bool char, vector bool char);
10221vector signed char vec_vmrghb (vector signed char, vector signed char);
10222vector unsigned char vec_vmrghb (vector unsigned char,
10223 vector unsigned char);
10224
10225vector bool char vec_mergel (vector bool char, vector bool char);
333c8841 10226vector signed char vec_mergel (vector signed char, vector signed char);
6e5bb5ad
JM
10227vector unsigned char vec_mergel (vector unsigned char,
10228 vector unsigned char);
b0b343db
JJ
10229vector bool short vec_mergel (vector bool short, vector bool short);
10230vector pixel vec_mergel (vector pixel, vector pixel);
924fcc4e
JM
10231vector signed short vec_mergel (vector signed short,
10232 vector signed short);
6e5bb5ad
JM
10233vector unsigned short vec_mergel (vector unsigned short,
10234 vector unsigned short);
333c8841 10235vector float vec_mergel (vector float, vector float);
b0b343db 10236vector bool int vec_mergel (vector bool int, vector bool int);
333c8841 10237vector signed int vec_mergel (vector signed int, vector signed int);
924fcc4e
JM
10238vector unsigned int vec_mergel (vector unsigned int,
10239 vector unsigned int);
333c8841 10240
b0b343db
JJ
10241vector float vec_vmrglw (vector float, vector float);
10242vector signed int vec_vmrglw (vector signed int, vector signed int);
10243vector unsigned int vec_vmrglw (vector unsigned int,
10244 vector unsigned int);
10245vector bool int vec_vmrglw (vector bool int, vector bool int);
333c8841 10246
b0b343db
JJ
10247vector bool short vec_vmrglh (vector bool short, vector bool short);
10248vector signed short vec_vmrglh (vector signed short,
10249 vector signed short);
10250vector unsigned short vec_vmrglh (vector unsigned short,
10251 vector unsigned short);
10252vector pixel vec_vmrglh (vector pixel, vector pixel);
10253
10254vector bool char vec_vmrglb (vector bool char, vector bool char);
10255vector signed char vec_vmrglb (vector signed char, vector signed char);
10256vector unsigned char vec_vmrglb (vector unsigned char,
10257 vector unsigned char);
333c8841 10258
b0b343db 10259vector unsigned short vec_mfvscr (void);
333c8841 10260
b0b343db
JJ
10261vector unsigned char vec_min (vector bool char, vector unsigned char);
10262vector unsigned char vec_min (vector unsigned char, vector bool char);
924fcc4e
JM
10263vector unsigned char vec_min (vector unsigned char,
10264 vector unsigned char);
b0b343db
JJ
10265vector signed char vec_min (vector bool char, vector signed char);
10266vector signed char vec_min (vector signed char, vector bool char);
333c8841 10267vector signed char vec_min (vector signed char, vector signed char);
b0b343db 10268vector unsigned short vec_min (vector bool short,
924fcc4e
JM
10269 vector unsigned short);
10270vector unsigned short vec_min (vector unsigned short,
b0b343db 10271 vector bool short);
6e5bb5ad
JM
10272vector unsigned short vec_min (vector unsigned short,
10273 vector unsigned short);
b0b343db
JJ
10274vector signed short vec_min (vector bool short, vector signed short);
10275vector signed short vec_min (vector signed short, vector bool short);
333c8841 10276vector signed short vec_min (vector signed short, vector signed short);
b0b343db
JJ
10277vector unsigned int vec_min (vector bool int, vector unsigned int);
10278vector unsigned int vec_min (vector unsigned int, vector bool int);
333c8841 10279vector unsigned int vec_min (vector unsigned int, vector unsigned int);
b0b343db
JJ
10280vector signed int vec_min (vector bool int, vector signed int);
10281vector signed int vec_min (vector signed int, vector bool int);
333c8841
AH
10282vector signed int vec_min (vector signed int, vector signed int);
10283vector float vec_min (vector float, vector float);
10284
b0b343db
JJ
10285vector float vec_vminfp (vector float, vector float);
10286
10287vector signed int vec_vminsw (vector bool int, vector signed int);
10288vector signed int vec_vminsw (vector signed int, vector bool int);
10289vector signed int vec_vminsw (vector signed int, vector signed int);
10290
10291vector unsigned int vec_vminuw (vector bool int, vector unsigned int);
10292vector unsigned int vec_vminuw (vector unsigned int, vector bool int);
10293vector unsigned int vec_vminuw (vector unsigned int,
10294 vector unsigned int);
10295
10296vector signed short vec_vminsh (vector bool short, vector signed short);
10297vector signed short vec_vminsh (vector signed short, vector bool short);
10298vector signed short vec_vminsh (vector signed short,
10299 vector signed short);
10300
10301vector unsigned short vec_vminuh (vector bool short,
10302 vector unsigned short);
10303vector unsigned short vec_vminuh (vector unsigned short,
10304 vector bool short);
10305vector unsigned short vec_vminuh (vector unsigned short,
10306 vector unsigned short);
10307
10308vector signed char vec_vminsb (vector bool char, vector signed char);
10309vector signed char vec_vminsb (vector signed char, vector bool char);
10310vector signed char vec_vminsb (vector signed char, vector signed char);
10311
10312vector unsigned char vec_vminub (vector bool char,
10313 vector unsigned char);
10314vector unsigned char vec_vminub (vector unsigned char,
10315 vector bool char);
10316vector unsigned char vec_vminub (vector unsigned char,
10317 vector unsigned char);
10318
10319vector signed short vec_mladd (vector signed short,
10320 vector signed short,
6e5bb5ad 10321 vector signed short);
924fcc4e
JM
10322vector signed short vec_mladd (vector signed short,
10323 vector unsigned short,
6e5bb5ad 10324 vector unsigned short);
924fcc4e
JM
10325vector signed short vec_mladd (vector unsigned short,
10326 vector signed short,
6e5bb5ad
JM
10327 vector signed short);
10328vector unsigned short vec_mladd (vector unsigned short,
10329 vector unsigned short,
10330 vector unsigned short);
10331
924fcc4e
JM
10332vector signed short vec_mradds (vector signed short,
10333 vector signed short,
6e5bb5ad
JM
10334 vector signed short);
10335
924fcc4e
JM
10336vector unsigned int vec_msum (vector unsigned char,
10337 vector unsigned char,
6e5bb5ad 10338 vector unsigned int);
b0b343db
JJ
10339vector signed int vec_msum (vector signed char,
10340 vector unsigned char,
6e5bb5ad 10341 vector signed int);
924fcc4e
JM
10342vector unsigned int vec_msum (vector unsigned short,
10343 vector unsigned short,
6e5bb5ad 10344 vector unsigned int);
b0b343db
JJ
10345vector signed int vec_msum (vector signed short,
10346 vector signed short,
6e5bb5ad
JM
10347 vector signed int);
10348
b0b343db
JJ
10349vector signed int vec_vmsumshm (vector signed short,
10350 vector signed short,
10351 vector signed int);
10352
10353vector unsigned int vec_vmsumuhm (vector unsigned short,
10354 vector unsigned short,
10355 vector unsigned int);
10356
10357vector signed int vec_vmsummbm (vector signed char,
10358 vector unsigned char,
10359 vector signed int);
10360
10361vector unsigned int vec_vmsumubm (vector unsigned char,
10362 vector unsigned char,
10363 vector unsigned int);
10364
6e5bb5ad 10365vector unsigned int vec_msums (vector unsigned short,
924fcc4e
JM
10366 vector unsigned short,
10367 vector unsigned int);
b0b343db
JJ
10368vector signed int vec_msums (vector signed short,
10369 vector signed short,
6e5bb5ad 10370 vector signed int);
333c8841 10371
b0b343db
JJ
10372vector signed int vec_vmsumshs (vector signed short,
10373 vector signed short,
10374 vector signed int);
10375
10376vector unsigned int vec_vmsumuhs (vector unsigned short,
10377 vector unsigned short,
10378 vector unsigned int);
10379
333c8841
AH
10380void vec_mtvscr (vector signed int);
10381void vec_mtvscr (vector unsigned int);
b0b343db 10382void vec_mtvscr (vector bool int);
333c8841
AH
10383void vec_mtvscr (vector signed short);
10384void vec_mtvscr (vector unsigned short);
b0b343db
JJ
10385void vec_mtvscr (vector bool short);
10386void vec_mtvscr (vector pixel);
333c8841
AH
10387void vec_mtvscr (vector signed char);
10388void vec_mtvscr (vector unsigned char);
b0b343db 10389void vec_mtvscr (vector bool char);
333c8841 10390
924fcc4e
JM
10391vector unsigned short vec_mule (vector unsigned char,
10392 vector unsigned char);
b0b343db
JJ
10393vector signed short vec_mule (vector signed char,
10394 vector signed char);
924fcc4e
JM
10395vector unsigned int vec_mule (vector unsigned short,
10396 vector unsigned short);
333c8841
AH
10397vector signed int vec_mule (vector signed short, vector signed short);
10398
b0b343db
JJ
10399vector signed int vec_vmulesh (vector signed short,
10400 vector signed short);
10401
10402vector unsigned int vec_vmuleuh (vector unsigned short,
10403 vector unsigned short);
10404
10405vector signed short vec_vmulesb (vector signed char,
10406 vector signed char);
10407
10408vector unsigned short vec_vmuleub (vector unsigned char,
10409 vector unsigned char);
10410
924fcc4e
JM
10411vector unsigned short vec_mulo (vector unsigned char,
10412 vector unsigned char);
333c8841 10413vector signed short vec_mulo (vector signed char, vector signed char);
924fcc4e
JM
10414vector unsigned int vec_mulo (vector unsigned short,
10415 vector unsigned short);
333c8841
AH
10416vector signed int vec_mulo (vector signed short, vector signed short);
10417
b0b343db
JJ
10418vector signed int vec_vmulosh (vector signed short,
10419 vector signed short);
10420
10421vector unsigned int vec_vmulouh (vector unsigned short,
10422 vector unsigned short);
10423
10424vector signed short vec_vmulosb (vector signed char,
10425 vector signed char);
10426
10427vector unsigned short vec_vmuloub (vector unsigned char,
10428 vector unsigned char);
10429
333c8841
AH
10430vector float vec_nmsub (vector float, vector float, vector float);
10431
10432vector float vec_nor (vector float, vector float);
10433vector signed int vec_nor (vector signed int, vector signed int);
10434vector unsigned int vec_nor (vector unsigned int, vector unsigned int);
b0b343db 10435vector bool int vec_nor (vector bool int, vector bool int);
333c8841 10436vector signed short vec_nor (vector signed short, vector signed short);
6e5bb5ad
JM
10437vector unsigned short vec_nor (vector unsigned short,
10438 vector unsigned short);
b0b343db 10439vector bool short vec_nor (vector bool short, vector bool short);
333c8841 10440vector signed char vec_nor (vector signed char, vector signed char);
924fcc4e
JM
10441vector unsigned char vec_nor (vector unsigned char,
10442 vector unsigned char);
b0b343db 10443vector bool char vec_nor (vector bool char, vector bool char);
333c8841
AH
10444
10445vector float vec_or (vector float, vector float);
b0b343db
JJ
10446vector float vec_or (vector float, vector bool int);
10447vector float vec_or (vector bool int, vector float);
10448vector bool int vec_or (vector bool int, vector bool int);
10449vector signed int vec_or (vector bool int, vector signed int);
10450vector signed int vec_or (vector signed int, vector bool int);
333c8841 10451vector signed int vec_or (vector signed int, vector signed int);
b0b343db
JJ
10452vector unsigned int vec_or (vector bool int, vector unsigned int);
10453vector unsigned int vec_or (vector unsigned int, vector bool int);
333c8841 10454vector unsigned int vec_or (vector unsigned int, vector unsigned int);
b0b343db
JJ
10455vector bool short vec_or (vector bool short, vector bool short);
10456vector signed short vec_or (vector bool short, vector signed short);
10457vector signed short vec_or (vector signed short, vector bool short);
333c8841 10458vector signed short vec_or (vector signed short, vector signed short);
b0b343db
JJ
10459vector unsigned short vec_or (vector bool short, vector unsigned short);
10460vector unsigned short vec_or (vector unsigned short, vector bool short);
924fcc4e
JM
10461vector unsigned short vec_or (vector unsigned short,
10462 vector unsigned short);
b0b343db
JJ
10463vector signed char vec_or (vector bool char, vector signed char);
10464vector bool char vec_or (vector bool char, vector bool char);
10465vector signed char vec_or (vector signed char, vector bool char);
333c8841 10466vector signed char vec_or (vector signed char, vector signed char);
b0b343db
JJ
10467vector unsigned char vec_or (vector bool char, vector unsigned char);
10468vector unsigned char vec_or (vector unsigned char, vector bool char);
924fcc4e
JM
10469vector unsigned char vec_or (vector unsigned char,
10470 vector unsigned char);
333c8841
AH
10471
10472vector signed char vec_pack (vector signed short, vector signed short);
6e5bb5ad
JM
10473vector unsigned char vec_pack (vector unsigned short,
10474 vector unsigned short);
b0b343db 10475vector bool char vec_pack (vector bool short, vector bool short);
333c8841 10476vector signed short vec_pack (vector signed int, vector signed int);
924fcc4e
JM
10477vector unsigned short vec_pack (vector unsigned int,
10478 vector unsigned int);
b0b343db 10479vector bool short vec_pack (vector bool int, vector bool int);
333c8841 10480
b0b343db
JJ
10481vector bool short vec_vpkuwum (vector bool int, vector bool int);
10482vector signed short vec_vpkuwum (vector signed int, vector signed int);
10483vector unsigned short vec_vpkuwum (vector unsigned int,
10484 vector unsigned int);
10485
10486vector bool char vec_vpkuhum (vector bool short, vector bool short);
10487vector signed char vec_vpkuhum (vector signed short,
10488 vector signed short);
10489vector unsigned char vec_vpkuhum (vector unsigned short,
10490 vector unsigned short);
10491
10492vector pixel vec_packpx (vector unsigned int, vector unsigned int);
333c8841 10493
6e5bb5ad
JM
10494vector unsigned char vec_packs (vector unsigned short,
10495 vector unsigned short);
333c8841 10496vector signed char vec_packs (vector signed short, vector signed short);
924fcc4e
JM
10497vector unsigned short vec_packs (vector unsigned int,
10498 vector unsigned int);
333c8841
AH
10499vector signed short vec_packs (vector signed int, vector signed int);
10500
b0b343db
JJ
10501vector signed short vec_vpkswss (vector signed int, vector signed int);
10502
10503vector unsigned short vec_vpkuwus (vector unsigned int,
10504 vector unsigned int);
10505
10506vector signed char vec_vpkshss (vector signed short,
10507 vector signed short);
10508
10509vector unsigned char vec_vpkuhus (vector unsigned short,
10510 vector unsigned short);
10511
6e5bb5ad
JM
10512vector unsigned char vec_packsu (vector unsigned short,
10513 vector unsigned short);
924fcc4e
JM
10514vector unsigned char vec_packsu (vector signed short,
10515 vector signed short);
10516vector unsigned short vec_packsu (vector unsigned int,
10517 vector unsigned int);
333c8841
AH
10518vector unsigned short vec_packsu (vector signed int, vector signed int);
10519
b0b343db
JJ
10520vector unsigned short vec_vpkswus (vector signed int,
10521 vector signed int);
10522
10523vector unsigned char vec_vpkshus (vector signed short,
10524 vector signed short);
10525
10526vector float vec_perm (vector float,
10527 vector float,
924fcc4e 10528 vector unsigned char);
b0b343db
JJ
10529vector signed int vec_perm (vector signed int,
10530 vector signed int,
6e5bb5ad 10531 vector unsigned char);
b0b343db
JJ
10532vector unsigned int vec_perm (vector unsigned int,
10533 vector unsigned int,
6e5bb5ad 10534 vector unsigned char);
b0b343db
JJ
10535vector bool int vec_perm (vector bool int,
10536 vector bool int,
10537 vector unsigned char);
10538vector signed short vec_perm (vector signed short,
10539 vector signed short,
6e5bb5ad
JM
10540 vector unsigned char);
10541vector unsigned short vec_perm (vector unsigned short,
10542 vector unsigned short,
10543 vector unsigned char);
b0b343db
JJ
10544vector bool short vec_perm (vector bool short,
10545 vector bool short,
10546 vector unsigned char);
10547vector pixel vec_perm (vector pixel,
10548 vector pixel,
10549 vector unsigned char);
10550vector signed char vec_perm (vector signed char,
10551 vector signed char,
6e5bb5ad 10552 vector unsigned char);
924fcc4e
JM
10553vector unsigned char vec_perm (vector unsigned char,
10554 vector unsigned char,
6e5bb5ad 10555 vector unsigned char);
b0b343db
JJ
10556vector bool char vec_perm (vector bool char,
10557 vector bool char,
10558 vector unsigned char);
333c8841
AH
10559
10560vector float vec_re (vector float);
10561
b0b343db
JJ
10562vector signed char vec_rl (vector signed char,
10563 vector unsigned char);
924fcc4e
JM
10564vector unsigned char vec_rl (vector unsigned char,
10565 vector unsigned char);
333c8841 10566vector signed short vec_rl (vector signed short, vector unsigned short);
924fcc4e
JM
10567vector unsigned short vec_rl (vector unsigned short,
10568 vector unsigned short);
333c8841
AH
10569vector signed int vec_rl (vector signed int, vector unsigned int);
10570vector unsigned int vec_rl (vector unsigned int, vector unsigned int);
10571
b0b343db
JJ
10572vector signed int vec_vrlw (vector signed int, vector unsigned int);
10573vector unsigned int vec_vrlw (vector unsigned int, vector unsigned int);
10574
10575vector signed short vec_vrlh (vector signed short,
10576 vector unsigned short);
10577vector unsigned short vec_vrlh (vector unsigned short,
10578 vector unsigned short);
10579
10580vector signed char vec_vrlb (vector signed char, vector unsigned char);
10581vector unsigned char vec_vrlb (vector unsigned char,
10582 vector unsigned char);
10583
333c8841
AH
10584vector float vec_round (vector float);
10585
10586vector float vec_rsqrte (vector float);
10587
b0b343db 10588vector float vec_sel (vector float, vector float, vector bool int);
333c8841 10589vector float vec_sel (vector float, vector float, vector unsigned int);
b0b343db
JJ
10590vector signed int vec_sel (vector signed int,
10591 vector signed int,
10592 vector bool int);
10593vector signed int vec_sel (vector signed int,
10594 vector signed int,
6e5bb5ad 10595 vector unsigned int);
b0b343db
JJ
10596vector unsigned int vec_sel (vector unsigned int,
10597 vector unsigned int,
10598 vector bool int);
10599vector unsigned int vec_sel (vector unsigned int,
10600 vector unsigned int,
6e5bb5ad 10601 vector unsigned int);
b0b343db
JJ
10602vector bool int vec_sel (vector bool int,
10603 vector bool int,
10604 vector bool int);
10605vector bool int vec_sel (vector bool int,
10606 vector bool int,
10607 vector unsigned int);
10608vector signed short vec_sel (vector signed short,
10609 vector signed short,
10610 vector bool short);
10611vector signed short vec_sel (vector signed short,
10612 vector signed short,
6e5bb5ad
JM
10613 vector unsigned short);
10614vector unsigned short vec_sel (vector unsigned short,
924fcc4e 10615 vector unsigned short,
b0b343db 10616 vector bool short);
6e5bb5ad
JM
10617vector unsigned short vec_sel (vector unsigned short,
10618 vector unsigned short,
10619 vector unsigned short);
b0b343db
JJ
10620vector bool short vec_sel (vector bool short,
10621 vector bool short,
10622 vector bool short);
10623vector bool short vec_sel (vector bool short,
10624 vector bool short,
10625 vector unsigned short);
10626vector signed char vec_sel (vector signed char,
10627 vector signed char,
10628 vector bool char);
10629vector signed char vec_sel (vector signed char,
10630 vector signed char,
6e5bb5ad 10631 vector unsigned char);
924fcc4e
JM
10632vector unsigned char vec_sel (vector unsigned char,
10633 vector unsigned char,
b0b343db 10634 vector bool char);
924fcc4e
JM
10635vector unsigned char vec_sel (vector unsigned char,
10636 vector unsigned char,
6e5bb5ad 10637 vector unsigned char);
b0b343db
JJ
10638vector bool char vec_sel (vector bool char,
10639 vector bool char,
10640 vector bool char);
10641vector bool char vec_sel (vector bool char,
10642 vector bool char,
10643 vector unsigned char);
10644
10645vector signed char vec_sl (vector signed char,
10646 vector unsigned char);
924fcc4e
JM
10647vector unsigned char vec_sl (vector unsigned char,
10648 vector unsigned char);
333c8841 10649vector signed short vec_sl (vector signed short, vector unsigned short);
924fcc4e
JM
10650vector unsigned short vec_sl (vector unsigned short,
10651 vector unsigned short);
333c8841
AH
10652vector signed int vec_sl (vector signed int, vector unsigned int);
10653vector unsigned int vec_sl (vector unsigned int, vector unsigned int);
10654
b0b343db
JJ
10655vector signed int vec_vslw (vector signed int, vector unsigned int);
10656vector unsigned int vec_vslw (vector unsigned int, vector unsigned int);
10657
10658vector signed short vec_vslh (vector signed short,
10659 vector unsigned short);
10660vector unsigned short vec_vslh (vector unsigned short,
10661 vector unsigned short);
10662
10663vector signed char vec_vslb (vector signed char, vector unsigned char);
10664vector unsigned char vec_vslb (vector unsigned char,
10665 vector unsigned char);
10666
10667vector float vec_sld (vector float, vector float, const int);
10668vector signed int vec_sld (vector signed int,
10669 vector signed int,
10670 const int);
10671vector unsigned int vec_sld (vector unsigned int,
10672 vector unsigned int,
10673 const int);
10674vector bool int vec_sld (vector bool int,
10675 vector bool int,
10676 const int);
10677vector signed short vec_sld (vector signed short,
10678 vector signed short,
10679 const int);
6e5bb5ad 10680vector unsigned short vec_sld (vector unsigned short,
b0b343db
JJ
10681 vector unsigned short,
10682 const int);
10683vector bool short vec_sld (vector bool short,
10684 vector bool short,
10685 const int);
10686vector pixel vec_sld (vector pixel,
10687 vector pixel,
10688 const int);
10689vector signed char vec_sld (vector signed char,
10690 vector signed char,
10691 const int);
924fcc4e
JM
10692vector unsigned char vec_sld (vector unsigned char,
10693 vector unsigned char,
b0b343db
JJ
10694 const int);
10695vector bool char vec_sld (vector bool char,
10696 vector bool char,
10697 const int);
333c8841 10698
b0b343db
JJ
10699vector signed int vec_sll (vector signed int,
10700 vector unsigned int);
10701vector signed int vec_sll (vector signed int,
10702 vector unsigned short);
10703vector signed int vec_sll (vector signed int,
10704 vector unsigned char);
10705vector unsigned int vec_sll (vector unsigned int,
10706 vector unsigned int);
924fcc4e
JM
10707vector unsigned int vec_sll (vector unsigned int,
10708 vector unsigned short);
b0b343db
JJ
10709vector unsigned int vec_sll (vector unsigned int,
10710 vector unsigned char);
10711vector bool int vec_sll (vector bool int,
10712 vector unsigned int);
10713vector bool int vec_sll (vector bool int,
10714 vector unsigned short);
10715vector bool int vec_sll (vector bool int,
10716 vector unsigned char);
10717vector signed short vec_sll (vector signed short,
10718 vector unsigned int);
924fcc4e
JM
10719vector signed short vec_sll (vector signed short,
10720 vector unsigned short);
b0b343db
JJ
10721vector signed short vec_sll (vector signed short,
10722 vector unsigned char);
924fcc4e
JM
10723vector unsigned short vec_sll (vector unsigned short,
10724 vector unsigned int);
6e5bb5ad
JM
10725vector unsigned short vec_sll (vector unsigned short,
10726 vector unsigned short);
924fcc4e
JM
10727vector unsigned short vec_sll (vector unsigned short,
10728 vector unsigned char);
b0b343db
JJ
10729vector bool short vec_sll (vector bool short, vector unsigned int);
10730vector bool short vec_sll (vector bool short, vector unsigned short);
10731vector bool short vec_sll (vector bool short, vector unsigned char);
10732vector pixel vec_sll (vector pixel, vector unsigned int);
10733vector pixel vec_sll (vector pixel, vector unsigned short);
10734vector pixel vec_sll (vector pixel, vector unsigned char);
333c8841
AH
10735vector signed char vec_sll (vector signed char, vector unsigned int);
10736vector signed char vec_sll (vector signed char, vector unsigned short);
10737vector signed char vec_sll (vector signed char, vector unsigned char);
924fcc4e
JM
10738vector unsigned char vec_sll (vector unsigned char,
10739 vector unsigned int);
10740vector unsigned char vec_sll (vector unsigned char,
10741 vector unsigned short);
10742vector unsigned char vec_sll (vector unsigned char,
10743 vector unsigned char);
b0b343db
JJ
10744vector bool char vec_sll (vector bool char, vector unsigned int);
10745vector bool char vec_sll (vector bool char, vector unsigned short);
10746vector bool char vec_sll (vector bool char, vector unsigned char);
333c8841
AH
10747
10748vector float vec_slo (vector float, vector signed char);
10749vector float vec_slo (vector float, vector unsigned char);
10750vector signed int vec_slo (vector signed int, vector signed char);
10751vector signed int vec_slo (vector signed int, vector unsigned char);
10752vector unsigned int vec_slo (vector unsigned int, vector signed char);
10753vector unsigned int vec_slo (vector unsigned int, vector unsigned char);
333c8841
AH
10754vector signed short vec_slo (vector signed short, vector signed char);
10755vector signed short vec_slo (vector signed short, vector unsigned char);
924fcc4e
JM
10756vector unsigned short vec_slo (vector unsigned short,
10757 vector signed char);
10758vector unsigned short vec_slo (vector unsigned short,
10759 vector unsigned char);
b0b343db
JJ
10760vector pixel vec_slo (vector pixel, vector signed char);
10761vector pixel vec_slo (vector pixel, vector unsigned char);
333c8841
AH
10762vector signed char vec_slo (vector signed char, vector signed char);
10763vector signed char vec_slo (vector signed char, vector unsigned char);
10764vector unsigned char vec_slo (vector unsigned char, vector signed char);
924fcc4e
JM
10765vector unsigned char vec_slo (vector unsigned char,
10766 vector unsigned char);
333c8841 10767
b0b343db
JJ
10768vector signed char vec_splat (vector signed char, const int);
10769vector unsigned char vec_splat (vector unsigned char, const int);
10770vector bool char vec_splat (vector bool char, const int);
10771vector signed short vec_splat (vector signed short, const int);
10772vector unsigned short vec_splat (vector unsigned short, const int);
10773vector bool short vec_splat (vector bool short, const int);
10774vector pixel vec_splat (vector pixel, const int);
10775vector float vec_splat (vector float, const int);
10776vector signed int vec_splat (vector signed int, const int);
10777vector unsigned int vec_splat (vector unsigned int, const int);
10778vector bool int vec_splat (vector bool int, const int);
10779
10780vector float vec_vspltw (vector float, const int);
10781vector signed int vec_vspltw (vector signed int, const int);
10782vector unsigned int vec_vspltw (vector unsigned int, const int);
10783vector bool int vec_vspltw (vector bool int, const int);
10784
10785vector bool short vec_vsplth (vector bool short, const int);
10786vector signed short vec_vsplth (vector signed short, const int);
10787vector unsigned short vec_vsplth (vector unsigned short, const int);
10788vector pixel vec_vsplth (vector pixel, const int);
10789
10790vector signed char vec_vspltb (vector signed char, const int);
10791vector unsigned char vec_vspltb (vector unsigned char, const int);
10792vector bool char vec_vspltb (vector bool char, const int);
333c8841 10793
b0b343db 10794vector signed char vec_splat_s8 (const int);
333c8841 10795
b0b343db 10796vector signed short vec_splat_s16 (const int);
333c8841 10797
b0b343db 10798vector signed int vec_splat_s32 (const int);
333c8841 10799
b0b343db 10800vector unsigned char vec_splat_u8 (const int);
333c8841 10801
b0b343db 10802vector unsigned short vec_splat_u16 (const int);
333c8841 10803
b0b343db 10804vector unsigned int vec_splat_u32 (const int);
333c8841
AH
10805
10806vector signed char vec_sr (vector signed char, vector unsigned char);
924fcc4e
JM
10807vector unsigned char vec_sr (vector unsigned char,
10808 vector unsigned char);
b0b343db
JJ
10809vector signed short vec_sr (vector signed short,
10810 vector unsigned short);
924fcc4e
JM
10811vector unsigned short vec_sr (vector unsigned short,
10812 vector unsigned short);
333c8841
AH
10813vector signed int vec_sr (vector signed int, vector unsigned int);
10814vector unsigned int vec_sr (vector unsigned int, vector unsigned int);
10815
b0b343db
JJ
10816vector signed int vec_vsrw (vector signed int, vector unsigned int);
10817vector unsigned int vec_vsrw (vector unsigned int, vector unsigned int);
10818
10819vector signed short vec_vsrh (vector signed short,
10820 vector unsigned short);
10821vector unsigned short vec_vsrh (vector unsigned short,
10822 vector unsigned short);
10823
10824vector signed char vec_vsrb (vector signed char, vector unsigned char);
10825vector unsigned char vec_vsrb (vector unsigned char,
10826 vector unsigned char);
10827
333c8841 10828vector signed char vec_sra (vector signed char, vector unsigned char);
924fcc4e
JM
10829vector unsigned char vec_sra (vector unsigned char,
10830 vector unsigned char);
10831vector signed short vec_sra (vector signed short,
10832 vector unsigned short);
6e5bb5ad
JM
10833vector unsigned short vec_sra (vector unsigned short,
10834 vector unsigned short);
333c8841
AH
10835vector signed int vec_sra (vector signed int, vector unsigned int);
10836vector unsigned int vec_sra (vector unsigned int, vector unsigned int);
10837
b0b343db
JJ
10838vector signed int vec_vsraw (vector signed int, vector unsigned int);
10839vector unsigned int vec_vsraw (vector unsigned int,
10840 vector unsigned int);
10841
10842vector signed short vec_vsrah (vector signed short,
10843 vector unsigned short);
10844vector unsigned short vec_vsrah (vector unsigned short,
10845 vector unsigned short);
10846
10847vector signed char vec_vsrab (vector signed char, vector unsigned char);
10848vector unsigned char vec_vsrab (vector unsigned char,
10849 vector unsigned char);
10850
333c8841
AH
10851vector signed int vec_srl (vector signed int, vector unsigned int);
10852vector signed int vec_srl (vector signed int, vector unsigned short);
10853vector signed int vec_srl (vector signed int, vector unsigned char);
10854vector unsigned int vec_srl (vector unsigned int, vector unsigned int);
924fcc4e
JM
10855vector unsigned int vec_srl (vector unsigned int,
10856 vector unsigned short);
333c8841 10857vector unsigned int vec_srl (vector unsigned int, vector unsigned char);
b0b343db
JJ
10858vector bool int vec_srl (vector bool int, vector unsigned int);
10859vector bool int vec_srl (vector bool int, vector unsigned short);
10860vector bool int vec_srl (vector bool int, vector unsigned char);
333c8841 10861vector signed short vec_srl (vector signed short, vector unsigned int);
924fcc4e
JM
10862vector signed short vec_srl (vector signed short,
10863 vector unsigned short);
333c8841 10864vector signed short vec_srl (vector signed short, vector unsigned char);
924fcc4e
JM
10865vector unsigned short vec_srl (vector unsigned short,
10866 vector unsigned int);
6e5bb5ad
JM
10867vector unsigned short vec_srl (vector unsigned short,
10868 vector unsigned short);
924fcc4e
JM
10869vector unsigned short vec_srl (vector unsigned short,
10870 vector unsigned char);
b0b343db
JJ
10871vector bool short vec_srl (vector bool short, vector unsigned int);
10872vector bool short vec_srl (vector bool short, vector unsigned short);
10873vector bool short vec_srl (vector bool short, vector unsigned char);
10874vector pixel vec_srl (vector pixel, vector unsigned int);
10875vector pixel vec_srl (vector pixel, vector unsigned short);
10876vector pixel vec_srl (vector pixel, vector unsigned char);
333c8841
AH
10877vector signed char vec_srl (vector signed char, vector unsigned int);
10878vector signed char vec_srl (vector signed char, vector unsigned short);
10879vector signed char vec_srl (vector signed char, vector unsigned char);
924fcc4e
JM
10880vector unsigned char vec_srl (vector unsigned char,
10881 vector unsigned int);
10882vector unsigned char vec_srl (vector unsigned char,
10883 vector unsigned short);
10884vector unsigned char vec_srl (vector unsigned char,
10885 vector unsigned char);
b0b343db
JJ
10886vector bool char vec_srl (vector bool char, vector unsigned int);
10887vector bool char vec_srl (vector bool char, vector unsigned short);
10888vector bool char vec_srl (vector bool char, vector unsigned char);
333c8841
AH
10889
10890vector float vec_sro (vector float, vector signed char);
10891vector float vec_sro (vector float, vector unsigned char);
10892vector signed int vec_sro (vector signed int, vector signed char);
10893vector signed int vec_sro (vector signed int, vector unsigned char);
10894vector unsigned int vec_sro (vector unsigned int, vector signed char);
10895vector unsigned int vec_sro (vector unsigned int, vector unsigned char);
333c8841
AH
10896vector signed short vec_sro (vector signed short, vector signed char);
10897vector signed short vec_sro (vector signed short, vector unsigned char);
924fcc4e
JM
10898vector unsigned short vec_sro (vector unsigned short,
10899 vector signed char);
10900vector unsigned short vec_sro (vector unsigned short,
10901 vector unsigned char);
b0b343db
JJ
10902vector pixel vec_sro (vector pixel, vector signed char);
10903vector pixel vec_sro (vector pixel, vector unsigned char);
333c8841
AH
10904vector signed char vec_sro (vector signed char, vector signed char);
10905vector signed char vec_sro (vector signed char, vector unsigned char);
10906vector unsigned char vec_sro (vector unsigned char, vector signed char);
924fcc4e
JM
10907vector unsigned char vec_sro (vector unsigned char,
10908 vector unsigned char);
333c8841 10909
333c8841 10910void vec_st (vector float, int, vector float *);
b0b343db
JJ
10911void vec_st (vector float, int, float *);
10912void vec_st (vector signed int, int, vector signed int *);
333c8841 10913void vec_st (vector signed int, int, int *);
333c8841 10914void vec_st (vector unsigned int, int, vector unsigned int *);
b0b343db
JJ
10915void vec_st (vector unsigned int, int, unsigned int *);
10916void vec_st (vector bool int, int, vector bool int *);
10917void vec_st (vector bool int, int, unsigned int *);
10918void vec_st (vector bool int, int, int *);
333c8841 10919void vec_st (vector signed short, int, vector signed short *);
b0b343db 10920void vec_st (vector signed short, int, short *);
333c8841 10921void vec_st (vector unsigned short, int, vector unsigned short *);
b0b343db
JJ
10922void vec_st (vector unsigned short, int, unsigned short *);
10923void vec_st (vector bool short, int, vector bool short *);
10924void vec_st (vector bool short, int, unsigned short *);
10925void vec_st (vector pixel, int, vector pixel *);
10926void vec_st (vector pixel, int, unsigned short *);
10927void vec_st (vector pixel, int, short *);
10928void vec_st (vector bool short, int, short *);
333c8841 10929void vec_st (vector signed char, int, vector signed char *);
b0b343db 10930void vec_st (vector signed char, int, signed char *);
333c8841 10931void vec_st (vector unsigned char, int, vector unsigned char *);
b0b343db
JJ
10932void vec_st (vector unsigned char, int, unsigned char *);
10933void vec_st (vector bool char, int, vector bool char *);
10934void vec_st (vector bool char, int, unsigned char *);
10935void vec_st (vector bool char, int, signed char *);
333c8841 10936
333c8841
AH
10937void vec_ste (vector signed char, int, signed char *);
10938void vec_ste (vector unsigned char, int, unsigned char *);
b0b343db
JJ
10939void vec_ste (vector bool char, int, signed char *);
10940void vec_ste (vector bool char, int, unsigned char *);
333c8841 10941void vec_ste (vector signed short, int, short *);
b0b343db
JJ
10942void vec_ste (vector unsigned short, int, unsigned short *);
10943void vec_ste (vector bool short, int, short *);
10944void vec_ste (vector bool short, int, unsigned short *);
10945void vec_ste (vector pixel, int, short *);
10946void vec_ste (vector pixel, int, unsigned short *);
10947void vec_ste (vector float, int, float *);
333c8841
AH
10948void vec_ste (vector signed int, int, int *);
10949void vec_ste (vector unsigned int, int, unsigned int *);
b0b343db
JJ
10950void vec_ste (vector bool int, int, int *);
10951void vec_ste (vector bool int, int, unsigned int *);
10952
10953void vec_stvewx (vector float, int, float *);
10954void vec_stvewx (vector signed int, int, int *);
10955void vec_stvewx (vector unsigned int, int, unsigned int *);
10956void vec_stvewx (vector bool int, int, int *);
10957void vec_stvewx (vector bool int, int, unsigned int *);
10958
10959void vec_stvehx (vector signed short, int, short *);
10960void vec_stvehx (vector unsigned short, int, unsigned short *);
10961void vec_stvehx (vector bool short, int, short *);
10962void vec_stvehx (vector bool short, int, unsigned short *);
10963void vec_stvehx (vector pixel, int, short *);
10964void vec_stvehx (vector pixel, int, unsigned short *);
10965
10966void vec_stvebx (vector signed char, int, signed char *);
10967void vec_stvebx (vector unsigned char, int, unsigned char *);
10968void vec_stvebx (vector bool char, int, signed char *);
10969void vec_stvebx (vector bool char, int, unsigned char *);
333c8841
AH
10970
10971void vec_stl (vector float, int, vector float *);
10972void vec_stl (vector float, int, float *);
10973void vec_stl (vector signed int, int, vector signed int *);
10974void vec_stl (vector signed int, int, int *);
333c8841
AH
10975void vec_stl (vector unsigned int, int, vector unsigned int *);
10976void vec_stl (vector unsigned int, int, unsigned int *);
b0b343db
JJ
10977void vec_stl (vector bool int, int, vector bool int *);
10978void vec_stl (vector bool int, int, unsigned int *);
10979void vec_stl (vector bool int, int, int *);
333c8841 10980void vec_stl (vector signed short, int, vector signed short *);
b0b343db
JJ
10981void vec_stl (vector signed short, int, short *);
10982void vec_stl (vector unsigned short, int, vector unsigned short *);
333c8841 10983void vec_stl (vector unsigned short, int, unsigned short *);
b0b343db
JJ
10984void vec_stl (vector bool short, int, vector bool short *);
10985void vec_stl (vector bool short, int, unsigned short *);
10986void vec_stl (vector bool short, int, short *);
10987void vec_stl (vector pixel, int, vector pixel *);
10988void vec_stl (vector pixel, int, unsigned short *);
10989void vec_stl (vector pixel, int, short *);
333c8841 10990void vec_stl (vector signed char, int, vector signed char *);
b0b343db 10991void vec_stl (vector signed char, int, signed char *);
333c8841 10992void vec_stl (vector unsigned char, int, vector unsigned char *);
b0b343db
JJ
10993void vec_stl (vector unsigned char, int, unsigned char *);
10994void vec_stl (vector bool char, int, vector bool char *);
10995void vec_stl (vector bool char, int, unsigned char *);
10996void vec_stl (vector bool char, int, signed char *);
333c8841 10997
b0b343db
JJ
10998vector signed char vec_sub (vector bool char, vector signed char);
10999vector signed char vec_sub (vector signed char, vector bool char);
333c8841 11000vector signed char vec_sub (vector signed char, vector signed char);
b0b343db
JJ
11001vector unsigned char vec_sub (vector bool char, vector unsigned char);
11002vector unsigned char vec_sub (vector unsigned char, vector bool char);
924fcc4e
JM
11003vector unsigned char vec_sub (vector unsigned char,
11004 vector unsigned char);
b0b343db
JJ
11005vector signed short vec_sub (vector bool short, vector signed short);
11006vector signed short vec_sub (vector signed short, vector bool short);
333c8841 11007vector signed short vec_sub (vector signed short, vector signed short);
b0b343db 11008vector unsigned short vec_sub (vector bool short,
924fcc4e
JM
11009 vector unsigned short);
11010vector unsigned short vec_sub (vector unsigned short,
b0b343db 11011 vector bool short);
6e5bb5ad
JM
11012vector unsigned short vec_sub (vector unsigned short,
11013 vector unsigned short);
b0b343db
JJ
11014vector signed int vec_sub (vector bool int, vector signed int);
11015vector signed int vec_sub (vector signed int, vector bool int);
333c8841 11016vector signed int vec_sub (vector signed int, vector signed int);
b0b343db
JJ
11017vector unsigned int vec_sub (vector bool int, vector unsigned int);
11018vector unsigned int vec_sub (vector unsigned int, vector bool int);
333c8841
AH
11019vector unsigned int vec_sub (vector unsigned int, vector unsigned int);
11020vector float vec_sub (vector float, vector float);
11021
b0b343db
JJ
11022vector float vec_vsubfp (vector float, vector float);
11023
11024vector signed int vec_vsubuwm (vector bool int, vector signed int);
11025vector signed int vec_vsubuwm (vector signed int, vector bool int);
11026vector signed int vec_vsubuwm (vector signed int, vector signed int);
11027vector unsigned int vec_vsubuwm (vector bool int, vector unsigned int);
11028vector unsigned int vec_vsubuwm (vector unsigned int, vector bool int);
11029vector unsigned int vec_vsubuwm (vector unsigned int,
11030 vector unsigned int);
11031
11032vector signed short vec_vsubuhm (vector bool short,
11033 vector signed short);
11034vector signed short vec_vsubuhm (vector signed short,
11035 vector bool short);
11036vector signed short vec_vsubuhm (vector signed short,
11037 vector signed short);
11038vector unsigned short vec_vsubuhm (vector bool short,
11039 vector unsigned short);
11040vector unsigned short vec_vsubuhm (vector unsigned short,
11041 vector bool short);
11042vector unsigned short vec_vsubuhm (vector unsigned short,
11043 vector unsigned short);
11044
11045vector signed char vec_vsububm (vector bool char, vector signed char);
11046vector signed char vec_vsububm (vector signed char, vector bool char);
11047vector signed char vec_vsububm (vector signed char, vector signed char);
11048vector unsigned char vec_vsububm (vector bool char,
11049 vector unsigned char);
11050vector unsigned char vec_vsububm (vector unsigned char,
11051 vector bool char);
11052vector unsigned char vec_vsububm (vector unsigned char,
11053 vector unsigned char);
11054
333c8841
AH
11055vector unsigned int vec_subc (vector unsigned int, vector unsigned int);
11056
b0b343db
JJ
11057vector unsigned char vec_subs (vector bool char, vector unsigned char);
11058vector unsigned char vec_subs (vector unsigned char, vector bool char);
924fcc4e
JM
11059vector unsigned char vec_subs (vector unsigned char,
11060 vector unsigned char);
b0b343db
JJ
11061vector signed char vec_subs (vector bool char, vector signed char);
11062vector signed char vec_subs (vector signed char, vector bool char);
333c8841 11063vector signed char vec_subs (vector signed char, vector signed char);
b0b343db 11064vector unsigned short vec_subs (vector bool short,
924fcc4e
JM
11065 vector unsigned short);
11066vector unsigned short vec_subs (vector unsigned short,
b0b343db 11067 vector bool short);
6e5bb5ad
JM
11068vector unsigned short vec_subs (vector unsigned short,
11069 vector unsigned short);
b0b343db
JJ
11070vector signed short vec_subs (vector bool short, vector signed short);
11071vector signed short vec_subs (vector signed short, vector bool short);
333c8841 11072vector signed short vec_subs (vector signed short, vector signed short);
b0b343db
JJ
11073vector unsigned int vec_subs (vector bool int, vector unsigned int);
11074vector unsigned int vec_subs (vector unsigned int, vector bool int);
333c8841 11075vector unsigned int vec_subs (vector unsigned int, vector unsigned int);
b0b343db
JJ
11076vector signed int vec_subs (vector bool int, vector signed int);
11077vector signed int vec_subs (vector signed int, vector bool int);
333c8841
AH
11078vector signed int vec_subs (vector signed int, vector signed int);
11079
b0b343db
JJ
11080vector signed int vec_vsubsws (vector bool int, vector signed int);
11081vector signed int vec_vsubsws (vector signed int, vector bool int);
11082vector signed int vec_vsubsws (vector signed int, vector signed int);
11083
11084vector unsigned int vec_vsubuws (vector bool int, vector unsigned int);
11085vector unsigned int vec_vsubuws (vector unsigned int, vector bool int);
11086vector unsigned int vec_vsubuws (vector unsigned int,
11087 vector unsigned int);
11088
11089vector signed short vec_vsubshs (vector bool short,
11090 vector signed short);
11091vector signed short vec_vsubshs (vector signed short,
11092 vector bool short);
11093vector signed short vec_vsubshs (vector signed short,
11094 vector signed short);
11095
11096vector unsigned short vec_vsubuhs (vector bool short,
11097 vector unsigned short);
11098vector unsigned short vec_vsubuhs (vector unsigned short,
11099 vector bool short);
11100vector unsigned short vec_vsubuhs (vector unsigned short,
11101 vector unsigned short);
11102
11103vector signed char vec_vsubsbs (vector bool char, vector signed char);
11104vector signed char vec_vsubsbs (vector signed char, vector bool char);
11105vector signed char vec_vsubsbs (vector signed char, vector signed char);
11106
11107vector unsigned char vec_vsububs (vector bool char,
11108 vector unsigned char);
11109vector unsigned char vec_vsububs (vector unsigned char,
11110 vector bool char);
11111vector unsigned char vec_vsububs (vector unsigned char,
11112 vector unsigned char);
11113
924fcc4e
JM
11114vector unsigned int vec_sum4s (vector unsigned char,
11115 vector unsigned int);
333c8841
AH
11116vector signed int vec_sum4s (vector signed char, vector signed int);
11117vector signed int vec_sum4s (vector signed short, vector signed int);
11118
b0b343db
JJ
11119vector signed int vec_vsum4shs (vector signed short, vector signed int);
11120
11121vector signed int vec_vsum4sbs (vector signed char, vector signed int);
11122
11123vector unsigned int vec_vsum4ubs (vector unsigned char,
11124 vector unsigned int);
11125
333c8841
AH
11126vector signed int vec_sum2s (vector signed int, vector signed int);
11127
11128vector signed int vec_sums (vector signed int, vector signed int);
11129
11130vector float vec_trunc (vector float);
11131
11132vector signed short vec_unpackh (vector signed char);
b0b343db 11133vector bool short vec_unpackh (vector bool char);
333c8841 11134vector signed int vec_unpackh (vector signed short);
b0b343db
JJ
11135vector bool int vec_unpackh (vector bool short);
11136vector unsigned int vec_unpackh (vector pixel);
11137
11138vector bool int vec_vupkhsh (vector bool short);
11139vector signed int vec_vupkhsh (vector signed short);
11140
11141vector unsigned int vec_vupkhpx (vector pixel);
11142
11143vector bool short vec_vupkhsb (vector bool char);
11144vector signed short vec_vupkhsb (vector signed char);
333c8841
AH
11145
11146vector signed short vec_unpackl (vector signed char);
b0b343db
JJ
11147vector bool short vec_unpackl (vector bool char);
11148vector unsigned int vec_unpackl (vector pixel);
333c8841 11149vector signed int vec_unpackl (vector signed short);
b0b343db
JJ
11150vector bool int vec_unpackl (vector bool short);
11151
11152vector unsigned int vec_vupklpx (vector pixel);
11153
11154vector bool int vec_vupklsh (vector bool short);
11155vector signed int vec_vupklsh (vector signed short);
11156
11157vector bool short vec_vupklsb (vector bool char);
11158vector signed short vec_vupklsb (vector signed char);
333c8841
AH
11159
11160vector float vec_xor (vector float, vector float);
b0b343db
JJ
11161vector float vec_xor (vector float, vector bool int);
11162vector float vec_xor (vector bool int, vector float);
11163vector bool int vec_xor (vector bool int, vector bool int);
11164vector signed int vec_xor (vector bool int, vector signed int);
11165vector signed int vec_xor (vector signed int, vector bool int);
333c8841 11166vector signed int vec_xor (vector signed int, vector signed int);
b0b343db
JJ
11167vector unsigned int vec_xor (vector bool int, vector unsigned int);
11168vector unsigned int vec_xor (vector unsigned int, vector bool int);
333c8841 11169vector unsigned int vec_xor (vector unsigned int, vector unsigned int);
b0b343db
JJ
11170vector bool short vec_xor (vector bool short, vector bool short);
11171vector signed short vec_xor (vector bool short, vector signed short);
11172vector signed short vec_xor (vector signed short, vector bool short);
333c8841 11173vector signed short vec_xor (vector signed short, vector signed short);
b0b343db 11174vector unsigned short vec_xor (vector bool short,
924fcc4e
JM
11175 vector unsigned short);
11176vector unsigned short vec_xor (vector unsigned short,
b0b343db 11177 vector bool short);
6e5bb5ad
JM
11178vector unsigned short vec_xor (vector unsigned short,
11179 vector unsigned short);
b0b343db
JJ
11180vector signed char vec_xor (vector bool char, vector signed char);
11181vector bool char vec_xor (vector bool char, vector bool char);
11182vector signed char vec_xor (vector signed char, vector bool char);
333c8841 11183vector signed char vec_xor (vector signed char, vector signed char);
b0b343db
JJ
11184vector unsigned char vec_xor (vector bool char, vector unsigned char);
11185vector unsigned char vec_xor (vector unsigned char, vector bool char);
924fcc4e
JM
11186vector unsigned char vec_xor (vector unsigned char,
11187 vector unsigned char);
333c8841 11188
b0b343db
JJ
11189int vec_all_eq (vector signed char, vector bool char);
11190int vec_all_eq (vector signed char, vector signed char);
11191int vec_all_eq (vector unsigned char, vector bool char);
11192int vec_all_eq (vector unsigned char, vector unsigned char);
11193int vec_all_eq (vector bool char, vector bool char);
11194int vec_all_eq (vector bool char, vector unsigned char);
11195int vec_all_eq (vector bool char, vector signed char);
11196int vec_all_eq (vector signed short, vector bool short);
11197int vec_all_eq (vector signed short, vector signed short);
11198int vec_all_eq (vector unsigned short, vector bool short);
11199int vec_all_eq (vector unsigned short, vector unsigned short);
11200int vec_all_eq (vector bool short, vector bool short);
11201int vec_all_eq (vector bool short, vector unsigned short);
11202int vec_all_eq (vector bool short, vector signed short);
11203int vec_all_eq (vector pixel, vector pixel);
11204int vec_all_eq (vector signed int, vector bool int);
11205int vec_all_eq (vector signed int, vector signed int);
11206int vec_all_eq (vector unsigned int, vector bool int);
11207int vec_all_eq (vector unsigned int, vector unsigned int);
11208int vec_all_eq (vector bool int, vector bool int);
11209int vec_all_eq (vector bool int, vector unsigned int);
11210int vec_all_eq (vector bool int, vector signed int);
11211int vec_all_eq (vector float, vector float);
11212
11213int vec_all_ge (vector bool char, vector unsigned char);
11214int vec_all_ge (vector unsigned char, vector bool char);
11215int vec_all_ge (vector unsigned char, vector unsigned char);
11216int vec_all_ge (vector bool char, vector signed char);
11217int vec_all_ge (vector signed char, vector bool char);
11218int vec_all_ge (vector signed char, vector signed char);
11219int vec_all_ge (vector bool short, vector unsigned short);
11220int vec_all_ge (vector unsigned short, vector bool short);
11221int vec_all_ge (vector unsigned short, vector unsigned short);
11222int vec_all_ge (vector signed short, vector signed short);
11223int vec_all_ge (vector bool short, vector signed short);
11224int vec_all_ge (vector signed short, vector bool short);
11225int vec_all_ge (vector bool int, vector unsigned int);
11226int vec_all_ge (vector unsigned int, vector bool int);
11227int vec_all_ge (vector unsigned int, vector unsigned int);
11228int vec_all_ge (vector bool int, vector signed int);
11229int vec_all_ge (vector signed int, vector bool int);
11230int vec_all_ge (vector signed int, vector signed int);
11231int vec_all_ge (vector float, vector float);
11232
11233int vec_all_gt (vector bool char, vector unsigned char);
11234int vec_all_gt (vector unsigned char, vector bool char);
11235int vec_all_gt (vector unsigned char, vector unsigned char);
11236int vec_all_gt (vector bool char, vector signed char);
11237int vec_all_gt (vector signed char, vector bool char);
11238int vec_all_gt (vector signed char, vector signed char);
11239int vec_all_gt (vector bool short, vector unsigned short);
11240int vec_all_gt (vector unsigned short, vector bool short);
11241int vec_all_gt (vector unsigned short, vector unsigned short);
11242int vec_all_gt (vector bool short, vector signed short);
11243int vec_all_gt (vector signed short, vector bool short);
11244int vec_all_gt (vector signed short, vector signed short);
11245int vec_all_gt (vector bool int, vector unsigned int);
11246int vec_all_gt (vector unsigned int, vector bool int);
11247int vec_all_gt (vector unsigned int, vector unsigned int);
11248int vec_all_gt (vector bool int, vector signed int);
11249int vec_all_gt (vector signed int, vector bool int);
11250int vec_all_gt (vector signed int, vector signed int);
11251int vec_all_gt (vector float, vector float);
11252
11253int vec_all_in (vector float, vector float);
11254
11255int vec_all_le (vector bool char, vector unsigned char);
11256int vec_all_le (vector unsigned char, vector bool char);
11257int vec_all_le (vector unsigned char, vector unsigned char);
11258int vec_all_le (vector bool char, vector signed char);
11259int vec_all_le (vector signed char, vector bool char);
11260int vec_all_le (vector signed char, vector signed char);
11261int vec_all_le (vector bool short, vector unsigned short);
11262int vec_all_le (vector unsigned short, vector bool short);
11263int vec_all_le (vector unsigned short, vector unsigned short);
11264int vec_all_le (vector bool short, vector signed short);
11265int vec_all_le (vector signed short, vector bool short);
11266int vec_all_le (vector signed short, vector signed short);
11267int vec_all_le (vector bool int, vector unsigned int);
11268int vec_all_le (vector unsigned int, vector bool int);
11269int vec_all_le (vector unsigned int, vector unsigned int);
11270int vec_all_le (vector bool int, vector signed int);
11271int vec_all_le (vector signed int, vector bool int);
11272int vec_all_le (vector signed int, vector signed int);
11273int vec_all_le (vector float, vector float);
11274
11275int vec_all_lt (vector bool char, vector unsigned char);
11276int vec_all_lt (vector unsigned char, vector bool char);
11277int vec_all_lt (vector unsigned char, vector unsigned char);
11278int vec_all_lt (vector bool char, vector signed char);
11279int vec_all_lt (vector signed char, vector bool char);
11280int vec_all_lt (vector signed char, vector signed char);
11281int vec_all_lt (vector bool short, vector unsigned short);
11282int vec_all_lt (vector unsigned short, vector bool short);
11283int vec_all_lt (vector unsigned short, vector unsigned short);
11284int vec_all_lt (vector bool short, vector signed short);
11285int vec_all_lt (vector signed short, vector bool short);
11286int vec_all_lt (vector signed short, vector signed short);
11287int vec_all_lt (vector bool int, vector unsigned int);
11288int vec_all_lt (vector unsigned int, vector bool int);
11289int vec_all_lt (vector unsigned int, vector unsigned int);
11290int vec_all_lt (vector bool int, vector signed int);
11291int vec_all_lt (vector signed int, vector bool int);
11292int vec_all_lt (vector signed int, vector signed int);
11293int vec_all_lt (vector float, vector float);
11294
11295int vec_all_nan (vector float);
11296
11297int vec_all_ne (vector signed char, vector bool char);
11298int vec_all_ne (vector signed char, vector signed char);
11299int vec_all_ne (vector unsigned char, vector bool char);
11300int vec_all_ne (vector unsigned char, vector unsigned char);
11301int vec_all_ne (vector bool char, vector bool char);
11302int vec_all_ne (vector bool char, vector unsigned char);
11303int vec_all_ne (vector bool char, vector signed char);
11304int vec_all_ne (vector signed short, vector bool short);
11305int vec_all_ne (vector signed short, vector signed short);
11306int vec_all_ne (vector unsigned short, vector bool short);
11307int vec_all_ne (vector unsigned short, vector unsigned short);
11308int vec_all_ne (vector bool short, vector bool short);
11309int vec_all_ne (vector bool short, vector unsigned short);
11310int vec_all_ne (vector bool short, vector signed short);
11311int vec_all_ne (vector pixel, vector pixel);
11312int vec_all_ne (vector signed int, vector bool int);
11313int vec_all_ne (vector signed int, vector signed int);
11314int vec_all_ne (vector unsigned int, vector bool int);
11315int vec_all_ne (vector unsigned int, vector unsigned int);
11316int vec_all_ne (vector bool int, vector bool int);
11317int vec_all_ne (vector bool int, vector unsigned int);
11318int vec_all_ne (vector bool int, vector signed int);
11319int vec_all_ne (vector float, vector float);
11320
11321int vec_all_nge (vector float, vector float);
11322
11323int vec_all_ngt (vector float, vector float);
11324
11325int vec_all_nle (vector float, vector float);
11326
11327int vec_all_nlt (vector float, vector float);
11328
11329int vec_all_numeric (vector float);
11330
11331int vec_any_eq (vector signed char, vector bool char);
11332int vec_any_eq (vector signed char, vector signed char);
11333int vec_any_eq (vector unsigned char, vector bool char);
11334int vec_any_eq (vector unsigned char, vector unsigned char);
11335int vec_any_eq (vector bool char, vector bool char);
11336int vec_any_eq (vector bool char, vector unsigned char);
11337int vec_any_eq (vector bool char, vector signed char);
11338int vec_any_eq (vector signed short, vector bool short);
11339int vec_any_eq (vector signed short, vector signed short);
11340int vec_any_eq (vector unsigned short, vector bool short);
11341int vec_any_eq (vector unsigned short, vector unsigned short);
11342int vec_any_eq (vector bool short, vector bool short);
11343int vec_any_eq (vector bool short, vector unsigned short);
11344int vec_any_eq (vector bool short, vector signed short);
11345int vec_any_eq (vector pixel, vector pixel);
11346int vec_any_eq (vector signed int, vector bool int);
11347int vec_any_eq (vector signed int, vector signed int);
11348int vec_any_eq (vector unsigned int, vector bool int);
11349int vec_any_eq (vector unsigned int, vector unsigned int);
11350int vec_any_eq (vector bool int, vector bool int);
11351int vec_any_eq (vector bool int, vector unsigned int);
11352int vec_any_eq (vector bool int, vector signed int);
11353int vec_any_eq (vector float, vector float);
11354
11355int vec_any_ge (vector signed char, vector bool char);
11356int vec_any_ge (vector unsigned char, vector bool char);
11357int vec_any_ge (vector unsigned char, vector unsigned char);
11358int vec_any_ge (vector signed char, vector signed char);
11359int vec_any_ge (vector bool char, vector unsigned char);
11360int vec_any_ge (vector bool char, vector signed char);
11361int vec_any_ge (vector unsigned short, vector bool short);
11362int vec_any_ge (vector unsigned short, vector unsigned short);
11363int vec_any_ge (vector signed short, vector signed short);
11364int vec_any_ge (vector signed short, vector bool short);
11365int vec_any_ge (vector bool short, vector unsigned short);
11366int vec_any_ge (vector bool short, vector signed short);
11367int vec_any_ge (vector signed int, vector bool int);
11368int vec_any_ge (vector unsigned int, vector bool int);
11369int vec_any_ge (vector unsigned int, vector unsigned int);
11370int vec_any_ge (vector signed int, vector signed int);
11371int vec_any_ge (vector bool int, vector unsigned int);
11372int vec_any_ge (vector bool int, vector signed int);
11373int vec_any_ge (vector float, vector float);
11374
11375int vec_any_gt (vector bool char, vector unsigned char);
11376int vec_any_gt (vector unsigned char, vector bool char);
11377int vec_any_gt (vector unsigned char, vector unsigned char);
11378int vec_any_gt (vector bool char, vector signed char);
11379int vec_any_gt (vector signed char, vector bool char);
11380int vec_any_gt (vector signed char, vector signed char);
11381int vec_any_gt (vector bool short, vector unsigned short);
11382int vec_any_gt (vector unsigned short, vector bool short);
11383int vec_any_gt (vector unsigned short, vector unsigned short);
11384int vec_any_gt (vector bool short, vector signed short);
11385int vec_any_gt (vector signed short, vector bool short);
11386int vec_any_gt (vector signed short, vector signed short);
11387int vec_any_gt (vector bool int, vector unsigned int);
11388int vec_any_gt (vector unsigned int, vector bool int);
11389int vec_any_gt (vector unsigned int, vector unsigned int);
11390int vec_any_gt (vector bool int, vector signed int);
11391int vec_any_gt (vector signed int, vector bool int);
11392int vec_any_gt (vector signed int, vector signed int);
11393int vec_any_gt (vector float, vector float);
11394
11395int vec_any_le (vector bool char, vector unsigned char);
11396int vec_any_le (vector unsigned char, vector bool char);
11397int vec_any_le (vector unsigned char, vector unsigned char);
11398int vec_any_le (vector bool char, vector signed char);
11399int vec_any_le (vector signed char, vector bool char);
11400int vec_any_le (vector signed char, vector signed char);
11401int vec_any_le (vector bool short, vector unsigned short);
11402int vec_any_le (vector unsigned short, vector bool short);
11403int vec_any_le (vector unsigned short, vector unsigned short);
11404int vec_any_le (vector bool short, vector signed short);
11405int vec_any_le (vector signed short, vector bool short);
11406int vec_any_le (vector signed short, vector signed short);
11407int vec_any_le (vector bool int, vector unsigned int);
11408int vec_any_le (vector unsigned int, vector bool int);
11409int vec_any_le (vector unsigned int, vector unsigned int);
11410int vec_any_le (vector bool int, vector signed int);
11411int vec_any_le (vector signed int, vector bool int);
11412int vec_any_le (vector signed int, vector signed int);
11413int vec_any_le (vector float, vector float);
11414
11415int vec_any_lt (vector bool char, vector unsigned char);
11416int vec_any_lt (vector unsigned char, vector bool char);
11417int vec_any_lt (vector unsigned char, vector unsigned char);
11418int vec_any_lt (vector bool char, vector signed char);
11419int vec_any_lt (vector signed char, vector bool char);
11420int vec_any_lt (vector signed char, vector signed char);
11421int vec_any_lt (vector bool short, vector unsigned short);
11422int vec_any_lt (vector unsigned short, vector bool short);
11423int vec_any_lt (vector unsigned short, vector unsigned short);
11424int vec_any_lt (vector bool short, vector signed short);
11425int vec_any_lt (vector signed short, vector bool short);
11426int vec_any_lt (vector signed short, vector signed short);
11427int vec_any_lt (vector bool int, vector unsigned int);
11428int vec_any_lt (vector unsigned int, vector bool int);
11429int vec_any_lt (vector unsigned int, vector unsigned int);
11430int vec_any_lt (vector bool int, vector signed int);
11431int vec_any_lt (vector signed int, vector bool int);
11432int vec_any_lt (vector signed int, vector signed int);
11433int vec_any_lt (vector float, vector float);
11434
11435int vec_any_nan (vector float);
11436
11437int vec_any_ne (vector signed char, vector bool char);
11438int vec_any_ne (vector signed char, vector signed char);
11439int vec_any_ne (vector unsigned char, vector bool char);
11440int vec_any_ne (vector unsigned char, vector unsigned char);
11441int vec_any_ne (vector bool char, vector bool char);
11442int vec_any_ne (vector bool char, vector unsigned char);
11443int vec_any_ne (vector bool char, vector signed char);
11444int vec_any_ne (vector signed short, vector bool short);
11445int vec_any_ne (vector signed short, vector signed short);
11446int vec_any_ne (vector unsigned short, vector bool short);
11447int vec_any_ne (vector unsigned short, vector unsigned short);
11448int vec_any_ne (vector bool short, vector bool short);
11449int vec_any_ne (vector bool short, vector unsigned short);
11450int vec_any_ne (vector bool short, vector signed short);
11451int vec_any_ne (vector pixel, vector pixel);
11452int vec_any_ne (vector signed int, vector bool int);
11453int vec_any_ne (vector signed int, vector signed int);
11454int vec_any_ne (vector unsigned int, vector bool int);
11455int vec_any_ne (vector unsigned int, vector unsigned int);
11456int vec_any_ne (vector bool int, vector bool int);
11457int vec_any_ne (vector bool int, vector unsigned int);
11458int vec_any_ne (vector bool int, vector signed int);
11459int vec_any_ne (vector float, vector float);
11460
11461int vec_any_nge (vector float, vector float);
11462
11463int vec_any_ngt (vector float, vector float);
11464
11465int vec_any_nle (vector float, vector float);
11466
11467int vec_any_nlt (vector float, vector float);
11468
11469int vec_any_numeric (vector float);
11470
11471int vec_any_out (vector float, vector float);
333c8841
AH
11472@end smallexample
11473
c5145ceb
JM
11474@node SPARC VIS Built-in Functions
11475@subsection SPARC VIS Built-in Functions
11476
11477GCC supports SIMD operations on the SPARC using both the generic vector
2fd13506 11478extensions (@pxref{Vector Extensions}) as well as built-in functions for
c5145ceb
JM
11479the SPARC Visual Instruction Set (VIS). When you use the @option{-mvis}
11480switch, the VIS extension is exposed as the following built-in functions:
11481
11482@smallexample
11483typedef int v2si __attribute__ ((vector_size (8)));
11484typedef short v4hi __attribute__ ((vector_size (8)));
11485typedef short v2hi __attribute__ ((vector_size (4)));
11486typedef char v8qi __attribute__ ((vector_size (8)));
11487typedef char v4qi __attribute__ ((vector_size (4)));
11488
11489void * __builtin_vis_alignaddr (void *, long);
11490int64_t __builtin_vis_faligndatadi (int64_t, int64_t);
11491v2si __builtin_vis_faligndatav2si (v2si, v2si);
11492v4hi __builtin_vis_faligndatav4hi (v4si, v4si);
11493v8qi __builtin_vis_faligndatav8qi (v8qi, v8qi);
11494
11495v4hi __builtin_vis_fexpand (v4qi);
11496
11497v4hi __builtin_vis_fmul8x16 (v4qi, v4hi);
11498v4hi __builtin_vis_fmul8x16au (v4qi, v4hi);
11499v4hi __builtin_vis_fmul8x16al (v4qi, v4hi);
11500v4hi __builtin_vis_fmul8sux16 (v8qi, v4hi);
11501v4hi __builtin_vis_fmul8ulx16 (v8qi, v4hi);
11502v2si __builtin_vis_fmuld8sux16 (v4qi, v2hi);
11503v2si __builtin_vis_fmuld8ulx16 (v4qi, v2hi);
11504
11505v4qi __builtin_vis_fpack16 (v4hi);
11506v8qi __builtin_vis_fpack32 (v2si, v2si);
11507v2hi __builtin_vis_fpackfix (v2si);
11508v8qi __builtin_vis_fpmerge (v4qi, v4qi);
11509
11510int64_t __builtin_vis_pdist (v8qi, v8qi, int64_t);
11511@end smallexample
11512
85d9c13c
TS
11513@node SPU Built-in Functions
11514@subsection SPU Built-in Functions
11515
11516GCC provides extensions for the SPU processor as described in the
11517Sony/Toshiba/IBM SPU Language Extensions Specification, which can be
11518found at @uref{http://cell.scei.co.jp/} or
11519@uref{http://www.ibm.com/developerworks/power/cell/}. GCC's
11520implementation differs in several ways.
11521
11522@itemize @bullet
11523
11524@item
11525The optional extension of specifying vector constants in parentheses is
11526not supported.
11527
11528@item
11529A vector initializer requires no cast if the vector constant is of the
11530same type as the variable it is initializing.
11531
11532@item
11533If @code{signed} or @code{unsigned} is omitted, the signedness of the
11534vector type is the default signedness of the base type. The default
11535varies depending on the operating system, so a portable program should
11536always specify the signedness.
11537
11538@item
11539By default, the keyword @code{__vector} is added. The macro
11540@code{vector} is defined in @code{<spu_intrinsics.h>} and can be
11541undefined.
11542
11543@item
11544GCC allows using a @code{typedef} name as the type specifier for a
11545vector type.
11546
11547@item
11548For C, overloaded functions are implemented with macros so the following
11549does not work:
11550
11551@smallexample
11552 spu_add ((vector signed int)@{1, 2, 3, 4@}, foo);
11553@end smallexample
11554
11555Since @code{spu_add} is a macro, the vector constant in the example
11556is treated as four separate arguments. Wrap the entire argument in
11557parentheses for this to work.
11558
11559@item
11560The extended version of @code{__builtin_expect} is not supported.
11561
11562@end itemize
11563
5681c208 11564@emph{Note:} Only the interface described in the aforementioned
85d9c13c
TS
11565specification is supported. Internally, GCC uses built-in functions to
11566implement the required functionality, but these are not supported and
11567are subject to change without notice.
11568
a2bec818
DJ
11569@node Target Format Checks
11570@section Format Checks Specific to Particular Target Machines
11571
11572For some target machines, GCC supports additional options to the
11573format attribute
11574(@pxref{Function Attributes,,Declaring Attributes of Functions}).
11575
11576@menu
11577* Solaris Format Checks::
11578@end menu
11579
11580@node Solaris Format Checks
11581@subsection Solaris Format Checks
11582
11583Solaris targets support the @code{cmn_err} (or @code{__cmn_err__}) format
11584check. @code{cmn_err} accepts a subset of the standard @code{printf}
11585conversions, and the two-argument @code{%b} conversion for displaying
11586bit-fields. See the Solaris man page for @code{cmn_err} for more information.
11587
0168a849
SS
11588@node Pragmas
11589@section Pragmas Accepted by GCC
11590@cindex pragmas
11591@cindex #pragma
11592
11593GCC supports several types of pragmas, primarily in order to compile
11594code originally written for other compilers. Note that in general
11595we do not recommend the use of pragmas; @xref{Function Attributes},
11596for further explanation.
11597
11598@menu
11599* ARM Pragmas::
38b2d076 11600* M32C Pragmas::
a5c76ee6 11601* RS/6000 and PowerPC Pragmas::
0168a849 11602* Darwin Pragmas::
07a43492 11603* Solaris Pragmas::
84b8b0e0 11604* Symbol-Renaming Pragmas::
467cecf3 11605* Structure-Packing Pragmas::
52eb57df 11606* Weak Pragmas::
79cf5994 11607* Diagnostic Pragmas::
b9e75696 11608* Visibility Pragmas::
20cef83a 11609* Push/Pop Macro Pragmas::
ab442df7 11610* Function Specific Option Pragmas::
0168a849
SS
11611@end menu
11612
11613@node ARM Pragmas
11614@subsection ARM Pragmas
11615
11616The ARM target defines pragmas for controlling the default addition of
11617@code{long_call} and @code{short_call} attributes to functions.
11618@xref{Function Attributes}, for information about the effects of these
11619attributes.
11620
11621@table @code
11622@item long_calls
11623@cindex pragma, long_calls
11624Set all subsequent functions to have the @code{long_call} attribute.
11625
11626@item no_long_calls
11627@cindex pragma, no_long_calls
11628Set all subsequent functions to have the @code{short_call} attribute.
11629
11630@item long_calls_off
11631@cindex pragma, long_calls_off
11632Do not affect the @code{long_call} or @code{short_call} attributes of
11633subsequent functions.
11634@end table
11635
38b2d076
DD
11636@node M32C Pragmas
11637@subsection M32C Pragmas
11638
11639@table @code
11640@item memregs @var{number}
11641@cindex pragma, memregs
11642Overrides the command line option @code{-memregs=} for the current
11643file. Use with care! This pragma must be before any function in the
11644file, and mixing different memregs values in different objects may
11645make them incompatible. This pragma is useful when a
11646performance-critical function uses a memreg for temporary values,
11647as it may allow you to reduce the number of memregs used.
11648
11649@end table
11650
a5c76ee6
ZW
11651@node RS/6000 and PowerPC Pragmas
11652@subsection RS/6000 and PowerPC Pragmas
11653
11654The RS/6000 and PowerPC targets define one pragma for controlling
11655whether or not the @code{longcall} attribute is added to function
11656declarations by default. This pragma overrides the @option{-mlongcall}
95b1627e 11657option, but not the @code{longcall} and @code{shortcall} attributes.
a5c76ee6
ZW
11658@xref{RS/6000 and PowerPC Options}, for more information about when long
11659calls are and are not necessary.
11660
11661@table @code
11662@item longcall (1)
11663@cindex pragma, longcall
11664Apply the @code{longcall} attribute to all subsequent function
11665declarations.
11666
11667@item longcall (0)
11668Do not apply the @code{longcall} attribute to subsequent function
11669declarations.
11670@end table
11671
0168a849 11672@c Describe h8300 pragmas here.
0168a849
SS
11673@c Describe sh pragmas here.
11674@c Describe v850 pragmas here.
11675
11676@node Darwin Pragmas
11677@subsection Darwin Pragmas
11678
11679The following pragmas are available for all architectures running the
11680Darwin operating system. These are useful for compatibility with other
85ebf0c6 11681Mac OS compilers.
0168a849
SS
11682
11683@table @code
11684@item mark @var{tokens}@dots{}
11685@cindex pragma, mark
11686This pragma is accepted, but has no effect.
11687
11688@item options align=@var{alignment}
11689@cindex pragma, options align
11690This pragma sets the alignment of fields in structures. The values of
11691@var{alignment} may be @code{mac68k}, to emulate m68k alignment, or
11692@code{power}, to emulate PowerPC alignment. Uses of this pragma nest
11693properly; to restore the previous setting, use @code{reset} for the
11694@var{alignment}.
11695
11696@item segment @var{tokens}@dots{}
11697@cindex pragma, segment
11698This pragma is accepted, but has no effect.
11699
11700@item unused (@var{var} [, @var{var}]@dots{})
11701@cindex pragma, unused
11702This pragma declares variables to be possibly unused. GCC will not
11703produce warnings for the listed variables. The effect is similar to
11704that of the @code{unused} attribute, except that this pragma may appear
11705anywhere within the variables' scopes.
11706@end table
11707
07a43492
DJ
11708@node Solaris Pragmas
11709@subsection Solaris Pragmas
11710
11711The Solaris target supports @code{#pragma redefine_extname}
11712(@pxref{Symbol-Renaming Pragmas}). It also supports additional
11713@code{#pragma} directives for compatibility with the system compiler.
11714
11715@table @code
11716@item align @var{alignment} (@var{variable} [, @var{variable}]...)
11717@cindex pragma, align
11718
11719Increase the minimum alignment of each @var{variable} to @var{alignment}.
11720This is the same as GCC's @code{aligned} attribute @pxref{Variable
b5b3e36a 11721Attributes}). Macro expansion occurs on the arguments to this pragma
0ee2ea09 11722when compiling C and Objective-C@. It does not currently occur when
b5b3e36a
DJ
11723compiling C++, but this is a bug which may be fixed in a future
11724release.
07a43492
DJ
11725
11726@item fini (@var{function} [, @var{function}]...)
11727@cindex pragma, fini
11728
11729This pragma causes each listed @var{function} to be called after
11730main, or during shared module unloading, by adding a call to the
11731@code{.fini} section.
11732
11733@item init (@var{function} [, @var{function}]...)
11734@cindex pragma, init
11735
11736This pragma causes each listed @var{function} to be called during
11737initialization (before @code{main}) or during shared module loading, by
11738adding a call to the @code{.init} section.
11739
11740@end table
11741
84b8b0e0
ZW
11742@node Symbol-Renaming Pragmas
11743@subsection Symbol-Renaming Pragmas
41c64394 11744
84b8b0e0
ZW
11745For compatibility with the Solaris and Tru64 UNIX system headers, GCC
11746supports two @code{#pragma} directives which change the name used in
11747assembly for a given declaration. These pragmas are only available on
11748platforms whose system headers need them. To get this effect on all
11749platforms supported by GCC, use the asm labels extension (@pxref{Asm
11750Labels}).
41c64394
RH
11751
11752@table @code
11753@item redefine_extname @var{oldname} @var{newname}
11754@cindex pragma, redefine_extname
11755
84b8b0e0
ZW
11756This pragma gives the C function @var{oldname} the assembly symbol
11757@var{newname}. The preprocessor macro @code{__PRAGMA_REDEFINE_EXTNAME}
11758will be defined if this pragma is available (currently only on
11759Solaris).
41c64394 11760
41c64394
RH
11761@item extern_prefix @var{string}
11762@cindex pragma, extern_prefix
11763
84b8b0e0
ZW
11764This pragma causes all subsequent external function and variable
11765declarations to have @var{string} prepended to their assembly symbols.
11766This effect may be terminated with another @code{extern_prefix} pragma
11767whose argument is an empty string. The preprocessor macro
11768@code{__PRAGMA_EXTERN_PREFIX} will be defined if this pragma is
8a36672b 11769available (currently only on Tru64 UNIX)@.
41c64394
RH
11770@end table
11771
84b8b0e0
ZW
11772These pragmas and the asm labels extension interact in a complicated
11773manner. Here are some corner cases you may want to be aware of.
11774
11775@enumerate
11776@item Both pragmas silently apply only to declarations with external
11777linkage. Asm labels do not have this restriction.
11778
11779@item In C++, both pragmas silently apply only to declarations with
11780``C'' linkage. Again, asm labels do not have this restriction.
11781
11782@item If any of the three ways of changing the assembly name of a
11783declaration is applied to a declaration whose assembly name has
11784already been determined (either by a previous use of one of these
11785features, or because the compiler needed the assembly name in order to
11786generate code), and the new name is different, a warning issues and
11787the name does not change.
11788
11789@item The @var{oldname} used by @code{#pragma redefine_extname} is
11790always the C-language name.
11791
11792@item If @code{#pragma extern_prefix} is in effect, and a declaration
11793occurs with an asm label attached, the prefix is silently ignored for
11794that declaration.
11795
11796@item If @code{#pragma extern_prefix} and @code{#pragma redefine_extname}
11797apply to the same declaration, whichever triggered first wins, and a
11798warning issues if they contradict each other. (We would like to have
11799@code{#pragma redefine_extname} always win, for consistency with asm
11800labels, but if @code{#pragma extern_prefix} triggers first we have no
11801way of knowing that that happened.)
11802@end enumerate
11803
467cecf3
JB
11804@node Structure-Packing Pragmas
11805@subsection Structure-Packing Pragmas
11806
20cef83a
DS
11807For compatibility with Microsoft Windows compilers, GCC supports a
11808set of @code{#pragma} directives which change the maximum alignment of
11809members of structures (other than zero-width bitfields), unions, and
11810classes subsequently defined. The @var{n} value below always is required
11811to be a small power of two and specifies the new alignment in bytes.
467cecf3
JB
11812
11813@enumerate
11814@item @code{#pragma pack(@var{n})} simply sets the new alignment.
11815@item @code{#pragma pack()} sets the alignment to the one that was in
11816effect when compilation started (see also command line option
11817@option{-fpack-struct[=<n>]} @pxref{Code Gen Options}).
11818@item @code{#pragma pack(push[,@var{n}])} pushes the current alignment
11819setting on an internal stack and then optionally sets the new alignment.
11820@item @code{#pragma pack(pop)} restores the alignment setting to the one
11821saved at the top of the internal stack (and removes that stack entry).
11822Note that @code{#pragma pack([@var{n}])} does not influence this internal
11823stack; thus it is possible to have @code{#pragma pack(push)} followed by
11824multiple @code{#pragma pack(@var{n})} instances and finalized by a single
11825@code{#pragma pack(pop)}.
11826@end enumerate
11827
021efafc 11828Some targets, e.g.@: i386 and powerpc, support the @code{ms_struct}
6bb7beac
EC
11829@code{#pragma} which lays out a structure as the documented
11830@code{__attribute__ ((ms_struct))}.
11831@enumerate
11832@item @code{#pragma ms_struct on} turns on the layout for structures
11833declared.
11834@item @code{#pragma ms_struct off} turns off the layout for structures
11835declared.
11836@item @code{#pragma ms_struct reset} goes back to the default layout.
11837@end enumerate
11838
52eb57df
RH
11839@node Weak Pragmas
11840@subsection Weak Pragmas
11841
11842For compatibility with SVR4, GCC supports a set of @code{#pragma}
11843directives for declaring symbols to be weak, and defining weak
11844aliases.
11845
11846@table @code
11847@item #pragma weak @var{symbol}
11848@cindex pragma, weak
11849This pragma declares @var{symbol} to be weak, as if the declaration
11850had the attribute of the same name. The pragma may appear before
0ac11108 11851or after the declaration of @var{symbol}, but must appear before
52eb57df
RH
11852either its first use or its definition. It is not an error for
11853@var{symbol} to never be defined at all.
11854
11855@item #pragma weak @var{symbol1} = @var{symbol2}
11856This pragma declares @var{symbol1} to be a weak alias of @var{symbol2}.
11857It is an error if @var{symbol2} is not defined in the current
11858translation unit.
11859@end table
11860
79cf5994
DD
11861@node Diagnostic Pragmas
11862@subsection Diagnostic Pragmas
11863
11864GCC allows the user to selectively enable or disable certain types of
11865diagnostics, and change the kind of the diagnostic. For example, a
11866project's policy might require that all sources compile with
11867@option{-Werror} but certain files might have exceptions allowing
11868specific types of warnings. Or, a project might selectively enable
11869diagnostics and treat them as errors depending on which preprocessor
11870macros are defined.
11871
11872@table @code
11873@item #pragma GCC diagnostic @var{kind} @var{option}
11874@cindex pragma, diagnostic
11875
11876Modifies the disposition of a diagnostic. Note that not all
1eaf20ec 11877diagnostics are modifiable; at the moment only warnings (normally
923158be 11878controlled by @samp{-W@dots{}}) can be controlled, and not all of them.
79cf5994
DD
11879Use @option{-fdiagnostics-show-option} to determine which diagnostics
11880are controllable and which option controls them.
11881
11882@var{kind} is @samp{error} to treat this diagnostic as an error,
11883@samp{warning} to treat it like a warning (even if @option{-Werror} is
11884in effect), or @samp{ignored} if the diagnostic is to be ignored.
11885@var{option} is a double quoted string which matches the command line
11886option.
11887
11888@example
11889#pragma GCC diagnostic warning "-Wformat"
c116cd05
MLI
11890#pragma GCC diagnostic error "-Wformat"
11891#pragma GCC diagnostic ignored "-Wformat"
79cf5994
DD
11892@end example
11893
11894Note that these pragmas override any command line options. Also,
11895while it is syntactically valid to put these pragmas anywhere in your
11896sources, the only supported location for them is before any data or
11897functions are defined. Doing otherwise may result in unpredictable
11898results depending on how the optimizer manages your sources. If the
11899same option is listed multiple times, the last one specified is the
11900one that is in effect. This pragma is not intended to be a general
11901purpose replacement for command line options, but for implementing
11902strict control over project policies.
11903
11904@end table
11905
0d48657d
SB
11906GCC also offers a simple mechanism for printing messages during
11907compilation.
11908
11909@table @code
11910@item #pragma message @var{string}
11911@cindex pragma, diagnostic
11912
11913Prints @var{string} as a compiler message on compilation. The message
11914is informational only, and is neither a compilation warning nor an error.
11915
11916@smallexample
11917#pragma message "Compiling " __FILE__ "..."
11918@end smallexample
11919
11920@var{string} may be parenthesized, and is printed with location
11921information. For example,
11922
11923@smallexample
11924#define DO_PRAGMA(x) _Pragma (#x)
11925#define TODO(x) DO_PRAGMA(message ("TODO - " #x))
11926
11927TODO(Remember to fix this)
11928@end smallexample
11929
11930prints @samp{/tmp/file.c:4: note: #pragma message:
11931TODO - Remember to fix this}.
11932
11933@end table
11934
b9e75696
JM
11935@node Visibility Pragmas
11936@subsection Visibility Pragmas
11937
11938@table @code
11939@item #pragma GCC visibility push(@var{visibility})
11940@itemx #pragma GCC visibility pop
11941@cindex pragma, visibility
11942
11943This pragma allows the user to set the visibility for multiple
11944declarations without having to give each a visibility attribute
11945@xref{Function Attributes}, for more information about visibility and
11946the attribute syntax.
11947
11948In C++, @samp{#pragma GCC visibility} affects only namespace-scope
11949declarations. Class members and template specializations are not
11950affected; if you want to override the visibility for a particular
11951member or instantiation, you must use an attribute.
11952
11953@end table
11954
20cef83a
DS
11955
11956@node Push/Pop Macro Pragmas
11957@subsection Push/Pop Macro Pragmas
11958
11959For compatibility with Microsoft Windows compilers, GCC supports
11960@samp{#pragma push_macro(@var{"macro_name"})}
11961and @samp{#pragma pop_macro(@var{"macro_name"})}.
11962
11963@table @code
11964@item #pragma push_macro(@var{"macro_name"})
11965@cindex pragma, push_macro
11966This pragma saves the value of the macro named as @var{macro_name} to
11967the top of the stack for this macro.
11968
11969@item #pragma pop_macro(@var{"macro_name"})
11970@cindex pragma, pop_macro
11971This pragma sets the value of the macro named as @var{macro_name} to
11972the value on top of the stack for this macro. If the stack for
11973@var{macro_name} is empty, the value of the macro remains unchanged.
11974@end table
11975
11976For example:
11977
11978@smallexample
11979#define X 1
11980#pragma push_macro("X")
11981#undef X
11982#define X -1
11983#pragma pop_macro("X")
11984int x [X];
11985@end smallexample
11986
11987In this example, the definition of X as 1 is saved by @code{#pragma
11988push_macro} and restored by @code{#pragma pop_macro}.
11989
ab442df7
MM
11990@node Function Specific Option Pragmas
11991@subsection Function Specific Option Pragmas
11992
11993@table @code
5779e713
MM
11994@item #pragma GCC target (@var{"string"}...)
11995@cindex pragma GCC target
ab442df7
MM
11996
11997This pragma allows you to set target specific options for functions
11998defined later in the source file. One or more strings can be
11999specified. Each function that is defined after this point will be as
5779e713 12000if @code{attribute((target("STRING")))} was specified for that
ab442df7
MM
12001function. The parenthesis around the options is optional.
12002@xref{Function Attributes}, for more information about the
5779e713 12003@code{target} attribute and the attribute syntax.
ab442df7 12004
5779e713 12005The @samp{#pragma GCC target} pragma is not implemented in GCC
ab442df7 12006versions earlier than 4.4, and is currently only implemented for the
5779e713 12007386 and x86_64 backends.
ab442df7
MM
12008@end table
12009
ab442df7
MM
12010@table @code
12011@item #pragma GCC optimize (@var{"string"}...)
12012@cindex pragma GCC optimize
12013
12014This pragma allows you to set global optimization options for functions
12015defined later in the source file. One or more strings can be
12016specified. Each function that is defined after this point will be as
12017if @code{attribute((optimize("STRING")))} was specified for that
12018function. The parenthesis around the options is optional.
12019@xref{Function Attributes}, for more information about the
12020@code{optimize} attribute and the attribute syntax.
12021
12022The @samp{#pragma GCC optimize} pragma is not implemented in GCC
12023versions earlier than 4.4.
12024@end table
12025
12026@table @code
5779e713
MM
12027@item #pragma GCC push_options
12028@itemx #pragma GCC pop_options
12029@cindex pragma GCC push_options
12030@cindex pragma GCC pop_options
12031
12032These pragmas maintain a stack of the current target and optimization
12033options. It is intended for include files where you temporarily want
12034to switch to using a different @samp{#pragma GCC target} or
12035@samp{#pragma GCC optimize} and then to pop back to the previous
12036options.
12037
12038The @samp{#pragma GCC push_options} and @samp{#pragma GCC pop_options}
12039pragmas are not implemented in GCC versions earlier than 4.4.
ab442df7
MM
12040@end table
12041
12042@table @code
5779e713
MM
12043@item #pragma GCC reset_options
12044@cindex pragma GCC reset_options
ab442df7 12045
5779e713
MM
12046This pragma clears the current @code{#pragma GCC target} and
12047@code{#pragma GCC optimize} to use the default switches as specified
12048on the command line.
12049
12050The @samp{#pragma GCC reset_options} pragma is not implemented in GCC
12051versions earlier than 4.4.
ab442df7
MM
12052@end table
12053
3e96a2fd 12054@node Unnamed Fields
2fbebc71 12055@section Unnamed struct/union fields within structs/unions
3e96a2fd
DD
12056@cindex struct
12057@cindex union
12058
12059For compatibility with other compilers, GCC allows you to define
12060a structure or union that contains, as fields, structures and unions
12061without names. For example:
12062
3ab51846 12063@smallexample
3e96a2fd
DD
12064struct @{
12065 int a;
12066 union @{
12067 int b;
12068 float c;
12069 @};
12070 int d;
12071@} foo;
3ab51846 12072@end smallexample
3e96a2fd
DD
12073
12074In this example, the user would be able to access members of the unnamed
12075union with code like @samp{foo.b}. Note that only unnamed structs and
12076unions are allowed, you may not have, for example, an unnamed
12077@code{int}.
12078
12079You must never create such structures that cause ambiguous field definitions.
12080For example, this structure:
12081
3ab51846 12082@smallexample
3e96a2fd
DD
12083struct @{
12084 int a;
12085 struct @{
12086 int a;
12087 @};
12088@} foo;
3ab51846 12089@end smallexample
3e96a2fd
DD
12090
12091It is ambiguous which @code{a} is being referred to with @samp{foo.a}.
12092Such constructs are not supported and must be avoided. In the future,
12093such constructs may be detected and treated as compilation errors.
12094
2fbebc71
JM
12095@opindex fms-extensions
12096Unless @option{-fms-extensions} is used, the unnamed field must be a
12097structure or union definition without a tag (for example, @samp{struct
12098@{ int a; @};}). If @option{-fms-extensions} is used, the field may
12099also be a definition with a tag such as @samp{struct foo @{ int a;
12100@};}, a reference to a previously defined structure or union such as
12101@samp{struct foo;}, or a reference to a @code{typedef} name for a
12102previously defined structure or union type.
12103
3d78f2e9
RH
12104@node Thread-Local
12105@section Thread-Local Storage
12106@cindex Thread-Local Storage
9217ef40 12107@cindex @acronym{TLS}
3d78f2e9
RH
12108@cindex __thread
12109
9217ef40
RH
12110Thread-local storage (@acronym{TLS}) is a mechanism by which variables
12111are allocated such that there is one instance of the variable per extant
3d78f2e9
RH
12112thread. The run-time model GCC uses to implement this originates
12113in the IA-64 processor-specific ABI, but has since been migrated
12114to other processors as well. It requires significant support from
12115the linker (@command{ld}), dynamic linker (@command{ld.so}), and
12116system libraries (@file{libc.so} and @file{libpthread.so}), so it
9217ef40 12117is not available everywhere.
3d78f2e9
RH
12118
12119At the user level, the extension is visible with a new storage
12120class keyword: @code{__thread}. For example:
12121
3ab51846 12122@smallexample
3d78f2e9
RH
12123__thread int i;
12124extern __thread struct state s;
12125static __thread char *p;
3ab51846 12126@end smallexample
3d78f2e9
RH
12127
12128The @code{__thread} specifier may be used alone, with the @code{extern}
12129or @code{static} specifiers, but with no other storage class specifier.
12130When used with @code{extern} or @code{static}, @code{__thread} must appear
12131immediately after the other storage class specifier.
12132
12133The @code{__thread} specifier may be applied to any global, file-scoped
244c2241
RH
12134static, function-scoped static, or static data member of a class. It may
12135not be applied to block-scoped automatic or non-static data member.
3d78f2e9
RH
12136
12137When the address-of operator is applied to a thread-local variable, it is
12138evaluated at run-time and returns the address of the current thread's
12139instance of that variable. An address so obtained may be used by any
12140thread. When a thread terminates, any pointers to thread-local variables
12141in that thread become invalid.
12142
12143No static initialization may refer to the address of a thread-local variable.
12144
244c2241
RH
12145In C++, if an initializer is present for a thread-local variable, it must
12146be a @var{constant-expression}, as defined in 5.19.2 of the ANSI/ISO C++
12147standard.
3d78f2e9
RH
12148
12149See @uref{http://people.redhat.com/drepper/tls.pdf,
12150ELF Handling For Thread-Local Storage} for a detailed explanation of
12151the four thread-local storage addressing models, and how the run-time
12152is expected to function.
12153
9217ef40
RH
12154@menu
12155* C99 Thread-Local Edits::
12156* C++98 Thread-Local Edits::
12157@end menu
12158
12159@node C99 Thread-Local Edits
12160@subsection ISO/IEC 9899:1999 Edits for Thread-Local Storage
12161
12162The following are a set of changes to ISO/IEC 9899:1999 (aka C99)
12163that document the exact semantics of the language extension.
12164
12165@itemize @bullet
12166@item
12167@cite{5.1.2 Execution environments}
12168
12169Add new text after paragraph 1
12170
12171@quotation
12172Within either execution environment, a @dfn{thread} is a flow of
12173control within a program. It is implementation defined whether
12174or not there may be more than one thread associated with a program.
12175It is implementation defined how threads beyond the first are
12176created, the name and type of the function called at thread
12177startup, and how threads may be terminated. However, objects
12178with thread storage duration shall be initialized before thread
12179startup.
12180@end quotation
12181
12182@item
12183@cite{6.2.4 Storage durations of objects}
12184
12185Add new text before paragraph 3
12186
12187@quotation
12188An object whose identifier is declared with the storage-class
12189specifier @w{@code{__thread}} has @dfn{thread storage duration}.
12190Its lifetime is the entire execution of the thread, and its
12191stored value is initialized only once, prior to thread startup.
12192@end quotation
12193
12194@item
12195@cite{6.4.1 Keywords}
12196
12197Add @code{__thread}.
12198
12199@item
12200@cite{6.7.1 Storage-class specifiers}
12201
12202Add @code{__thread} to the list of storage class specifiers in
12203paragraph 1.
12204
12205Change paragraph 2 to
12206
12207@quotation
12208With the exception of @code{__thread}, at most one storage-class
12209specifier may be given [@dots{}]. The @code{__thread} specifier may
12210be used alone, or immediately following @code{extern} or
12211@code{static}.
12212@end quotation
12213
12214Add new text after paragraph 6
12215
12216@quotation
12217The declaration of an identifier for a variable that has
12218block scope that specifies @code{__thread} shall also
12219specify either @code{extern} or @code{static}.
12220
12221The @code{__thread} specifier shall be used only with
12222variables.
12223@end quotation
12224@end itemize
12225
12226@node C++98 Thread-Local Edits
12227@subsection ISO/IEC 14882:1998 Edits for Thread-Local Storage
12228
12229The following are a set of changes to ISO/IEC 14882:1998 (aka C++98)
12230that document the exact semantics of the language extension.
12231
12232@itemize @bullet
8d23a2c8 12233@item
9217ef40
RH
12234@b{[intro.execution]}
12235
12236New text after paragraph 4
12237
12238@quotation
12239A @dfn{thread} is a flow of control within the abstract machine.
12240It is implementation defined whether or not there may be more than
12241one thread.
12242@end quotation
12243
12244New text after paragraph 7
12245
12246@quotation
95b1627e 12247It is unspecified whether additional action must be taken to
9217ef40
RH
12248ensure when and whether side effects are visible to other threads.
12249@end quotation
12250
12251@item
12252@b{[lex.key]}
12253
12254Add @code{__thread}.
12255
12256@item
12257@b{[basic.start.main]}
12258
12259Add after paragraph 5
12260
12261@quotation
12262The thread that begins execution at the @code{main} function is called
95b1627e 12263the @dfn{main thread}. It is implementation defined how functions
9217ef40
RH
12264beginning threads other than the main thread are designated or typed.
12265A function so designated, as well as the @code{main} function, is called
12266a @dfn{thread startup function}. It is implementation defined what
12267happens if a thread startup function returns. It is implementation
12268defined what happens to other threads when any thread calls @code{exit}.
12269@end quotation
12270
12271@item
12272@b{[basic.start.init]}
12273
12274Add after paragraph 4
12275
12276@quotation
12277The storage for an object of thread storage duration shall be
c0478a66 12278statically initialized before the first statement of the thread startup
9217ef40
RH
12279function. An object of thread storage duration shall not require
12280dynamic initialization.
12281@end quotation
12282
12283@item
12284@b{[basic.start.term]}
12285
12286Add after paragraph 3
12287
12288@quotation
244c2241
RH
12289The type of an object with thread storage duration shall not have a
12290non-trivial destructor, nor shall it be an array type whose elements
12291(directly or indirectly) have non-trivial destructors.
9217ef40
RH
12292@end quotation
12293
12294@item
12295@b{[basic.stc]}
12296
12297Add ``thread storage duration'' to the list in paragraph 1.
12298
12299Change paragraph 2
12300
12301@quotation
12302Thread, static, and automatic storage durations are associated with
12303objects introduced by declarations [@dots{}].
12304@end quotation
12305
12306Add @code{__thread} to the list of specifiers in paragraph 3.
12307
12308@item
12309@b{[basic.stc.thread]}
12310
12311New section before @b{[basic.stc.static]}
12312
12313@quotation
63519d23 12314The keyword @code{__thread} applied to a non-local object gives the
9217ef40
RH
12315object thread storage duration.
12316
12317A local variable or class data member declared both @code{static}
12318and @code{__thread} gives the variable or member thread storage
12319duration.
12320@end quotation
12321
12322@item
12323@b{[basic.stc.static]}
12324
12325Change paragraph 1
12326
12327@quotation
12328All objects which have neither thread storage duration, dynamic
12329storage duration nor are local [@dots{}].
12330@end quotation
12331
12332@item
12333@b{[dcl.stc]}
12334
12335Add @code{__thread} to the list in paragraph 1.
12336
12337Change paragraph 1
12338
12339@quotation
12340With the exception of @code{__thread}, at most one
12341@var{storage-class-specifier} shall appear in a given
12342@var{decl-specifier-seq}. The @code{__thread} specifier may
12343be used alone, or immediately following the @code{extern} or
12344@code{static} specifiers. [@dots{}]
12345@end quotation
12346
12347Add after paragraph 5
12348
12349@quotation
12350The @code{__thread} specifier can be applied only to the names of objects
12351and to anonymous unions.
12352@end quotation
12353
12354@item
12355@b{[class.mem]}
12356
12357Add after paragraph 6
12358
12359@quotation
12360Non-@code{static} members shall not be @code{__thread}.
12361@end quotation
12362@end itemize
12363
f7fd775f
JW
12364@node Binary constants
12365@section Binary constants using the @samp{0b} prefix
12366@cindex Binary constants using the @samp{0b} prefix
12367
12368Integer constants can be written as binary constants, consisting of a
12369sequence of @samp{0} and @samp{1} digits, prefixed by @samp{0b} or
12370@samp{0B}. This is particularly useful in environments that operate a
12371lot on the bit-level (like microcontrollers).
12372
12373The following statements are identical:
12374
12375@smallexample
12376i = 42;
12377i = 0x2a;
12378i = 052;
12379i = 0b101010;
12380@end smallexample
12381
12382The type of these constants follows the same rules as for octal or
12383hexadecimal integer constants, so suffixes like @samp{L} or @samp{UL}
12384can be applied.
12385
c1f7febf
RK
12386@node C++ Extensions
12387@chapter Extensions to the C++ Language
12388@cindex extensions, C++ language
12389@cindex C++ language extensions
12390
12391The GNU compiler provides these extensions to the C++ language (and you
12392can also use most of the C language extensions in your C++ programs). If you
12393want to write code that checks whether these features are available, you can
12394test for the GNU compiler the same way as for C programs: check for a
12395predefined macro @code{__GNUC__}. You can also use @code{__GNUG__} to
48795525
GP
12396test specifically for GNU C++ (@pxref{Common Predefined Macros,,
12397Predefined Macros,cpp,The GNU C Preprocessor}).
c1f7febf
RK
12398
12399@menu
6ccde948 12400* Volatiles:: What constitutes an access to a volatile object.
49419c8f 12401* Restricted Pointers:: C99 restricted pointers and references.
7a81cf7f 12402* Vague Linkage:: Where G++ puts inlines, vtables and such.
c1f7febf 12403* C++ Interface:: You can use a single C++ header file for both
e6f3b89d 12404 declarations and definitions.
c1f7febf 12405* Template Instantiation:: Methods for ensuring that exactly one copy of
e6f3b89d 12406 each needed template instantiation is emitted.
0ded1f18
JM
12407* Bound member functions:: You can extract a function pointer to the
12408 method denoted by a @samp{->*} or @samp{.*} expression.
e6f3b89d 12409* C++ Attributes:: Variable, function, and type attributes for C++ only.
664a90c0 12410* Namespace Association:: Strong using-directives for namespace association.
cb68ec50 12411* Type Traits:: Compiler support for type traits
1f730ff7 12412* Java Exceptions:: Tweaking exception handling to work with Java.
90ea7324 12413* Deprecated Features:: Things will disappear from g++.
e6f3b89d 12414* Backwards Compatibility:: Compatibilities with earlier definitions of C++.
c1f7febf
RK
12415@end menu
12416
02cac427
NS
12417@node Volatiles
12418@section When is a Volatile Object Accessed?
12419@cindex accessing volatiles
12420@cindex volatile read
12421@cindex volatile write
12422@cindex volatile access
12423
767094dd
JM
12424Both the C and C++ standard have the concept of volatile objects. These
12425are normally accessed by pointers and used for accessing hardware. The
a9e64c63
EB
12426standards encourage compilers to refrain from optimizations concerning
12427accesses to volatile objects. The C standard leaves it implementation
12428defined as to what constitutes a volatile access. The C++ standard omits
12429to specify this, except to say that C++ should behave in a similar manner
767094dd 12430to C with respect to volatiles, where possible. The minimum either
8117da65 12431standard specifies is that at a sequence point all previous accesses to
02cac427 12432volatile objects have stabilized and no subsequent accesses have
767094dd 12433occurred. Thus an implementation is free to reorder and combine
02cac427 12434volatile accesses which occur between sequence points, but cannot do so
767094dd 12435for accesses across a sequence point. The use of volatiles does not
02cac427
NS
12436allow you to violate the restriction on updating objects multiple times
12437within a sequence point.
12438
a9e64c63 12439@xref{Qualifiers implementation, , Volatile qualifier and the C compiler}.
02cac427 12440
a9e64c63 12441The behavior differs slightly between C and C++ in the non-obvious cases:
02cac427 12442
3ab51846 12443@smallexample
c771326b 12444volatile int *src = @var{somevalue};
02cac427 12445*src;
3ab51846 12446@end smallexample
02cac427 12447
a9e64c63
EB
12448With C, such expressions are rvalues, and GCC interprets this either as a
12449read of the volatile object being pointed to or only as request to evaluate
12450the side-effects. The C++ standard specifies that such expressions do not
12451undergo lvalue to rvalue conversion, and that the type of the dereferenced
767094dd 12452object may be incomplete. The C++ standard does not specify explicitly
a9e64c63 12453that it is this lvalue to rvalue conversion which may be responsible for
767094dd
JM
12454causing an access. However, there is reason to believe that it is,
12455because otherwise certain simple expressions become undefined. However,
f0523f02 12456because it would surprise most programmers, G++ treats dereferencing a
a9e64c63 12457pointer to volatile object of complete type when the value is unused as
0ee2ea09 12458GCC would do for an equivalent type in C@. When the object has incomplete
a9e64c63
EB
12459type, G++ issues a warning; if you wish to force an error, you must
12460force a conversion to rvalue with, for instance, a static cast.
02cac427 12461
f0523f02 12462When using a reference to volatile, G++ does not treat equivalent
02cac427 12463expressions as accesses to volatiles, but instead issues a warning that
767094dd 12464no volatile is accessed. The rationale for this is that otherwise it
02cac427
NS
12465becomes difficult to determine where volatile access occur, and not
12466possible to ignore the return value from functions returning volatile
767094dd 12467references. Again, if you wish to force a read, cast the reference to
02cac427
NS
12468an rvalue.
12469
535233a8
NS
12470@node Restricted Pointers
12471@section Restricting Pointer Aliasing
12472@cindex restricted pointers
12473@cindex restricted references
12474@cindex restricted this pointer
12475
2dd76960 12476As with the C front end, G++ understands the C99 feature of restricted pointers,
535233a8 12477specified with the @code{__restrict__}, or @code{__restrict} type
767094dd 12478qualifier. Because you cannot compile C++ by specifying the @option{-std=c99}
535233a8
NS
12479language flag, @code{restrict} is not a keyword in C++.
12480
12481In addition to allowing restricted pointers, you can specify restricted
12482references, which indicate that the reference is not aliased in the local
12483context.
12484
3ab51846 12485@smallexample
535233a8
NS
12486void fn (int *__restrict__ rptr, int &__restrict__ rref)
12487@{
0d893a63 12488 /* @r{@dots{}} */
535233a8 12489@}
3ab51846 12490@end smallexample
535233a8
NS
12491
12492@noindent
12493In the body of @code{fn}, @var{rptr} points to an unaliased integer and
12494@var{rref} refers to a (different) unaliased integer.
12495
12496You may also specify whether a member function's @var{this} pointer is
12497unaliased by using @code{__restrict__} as a member function qualifier.
12498
3ab51846 12499@smallexample
535233a8
NS
12500void T::fn () __restrict__
12501@{
0d893a63 12502 /* @r{@dots{}} */
535233a8 12503@}
3ab51846 12504@end smallexample
535233a8
NS
12505
12506@noindent
12507Within the body of @code{T::fn}, @var{this} will have the effective
767094dd 12508definition @code{T *__restrict__ const this}. Notice that the
535233a8
NS
12509interpretation of a @code{__restrict__} member function qualifier is
12510different to that of @code{const} or @code{volatile} qualifier, in that it
767094dd 12511is applied to the pointer rather than the object. This is consistent with
535233a8
NS
12512other compilers which implement restricted pointers.
12513
12514As with all outermost parameter qualifiers, @code{__restrict__} is
767094dd 12515ignored in function definition matching. This means you only need to
535233a8
NS
12516specify @code{__restrict__} in a function definition, rather than
12517in a function prototype as well.
12518
7a81cf7f
JM
12519@node Vague Linkage
12520@section Vague Linkage
12521@cindex vague linkage
12522
12523There are several constructs in C++ which require space in the object
12524file but are not clearly tied to a single translation unit. We say that
12525these constructs have ``vague linkage''. Typically such constructs are
12526emitted wherever they are needed, though sometimes we can be more
12527clever.
12528
12529@table @asis
12530@item Inline Functions
12531Inline functions are typically defined in a header file which can be
12532included in many different compilations. Hopefully they can usually be
12533inlined, but sometimes an out-of-line copy is necessary, if the address
12534of the function is taken or if inlining fails. In general, we emit an
12535out-of-line copy in all translation units where one is needed. As an
12536exception, we only emit inline virtual functions with the vtable, since
12537it will always require a copy.
12538
12539Local static variables and string constants used in an inline function
12540are also considered to have vague linkage, since they must be shared
12541between all inlined and out-of-line instances of the function.
12542
12543@item VTables
12544@cindex vtable
12545C++ virtual functions are implemented in most compilers using a lookup
12546table, known as a vtable. The vtable contains pointers to the virtual
12547functions provided by a class, and each object of the class contains a
12548pointer to its vtable (or vtables, in some multiple-inheritance
12549situations). If the class declares any non-inline, non-pure virtual
12550functions, the first one is chosen as the ``key method'' for the class,
12551and the vtable is only emitted in the translation unit where the key
12552method is defined.
12553
12554@emph{Note:} If the chosen key method is later defined as inline, the
12555vtable will still be emitted in every translation unit which defines it.
12556Make sure that any inline virtuals are declared inline in the class
12557body, even if they are not defined there.
12558
12559@item type_info objects
12560@cindex type_info
12561@cindex RTTI
12562C++ requires information about types to be written out in order to
12563implement @samp{dynamic_cast}, @samp{typeid} and exception handling.
12564For polymorphic classes (classes with virtual functions), the type_info
12565object is written out along with the vtable so that @samp{dynamic_cast}
12566can determine the dynamic type of a class object at runtime. For all
12567other types, we write out the type_info object when it is used: when
12568applying @samp{typeid} to an expression, throwing an object, or
12569referring to a type in a catch clause or exception specification.
12570
12571@item Template Instantiations
12572Most everything in this section also applies to template instantiations,
12573but there are other options as well.
12574@xref{Template Instantiation,,Where's the Template?}.
12575
12576@end table
12577
12578When used with GNU ld version 2.8 or later on an ELF system such as
95fef11f 12579GNU/Linux or Solaris 2, or on Microsoft Windows, duplicate copies of
7a81cf7f
JM
12580these constructs will be discarded at link time. This is known as
12581COMDAT support.
12582
12583On targets that don't support COMDAT, but do support weak symbols, GCC
12584will use them. This way one copy will override all the others, but
12585the unused copies will still take up space in the executable.
12586
12587For targets which do not support either COMDAT or weak symbols,
12588most entities with vague linkage will be emitted as local symbols to
12589avoid duplicate definition errors from the linker. This will not happen
12590for local statics in inlines, however, as having multiple copies will
12591almost certainly break things.
12592
12593@xref{C++ Interface,,Declarations and Definitions in One Header}, for
12594another way to control placement of these constructs.
12595
c1f7febf 12596@node C++ Interface
fc72b380 12597@section #pragma interface and implementation
c1f7febf
RK
12598
12599@cindex interface and implementation headers, C++
12600@cindex C++ interface and implementation headers
c1f7febf 12601@cindex pragmas, interface and implementation
c1f7febf 12602
fc72b380
JM
12603@code{#pragma interface} and @code{#pragma implementation} provide the
12604user with a way of explicitly directing the compiler to emit entities
12605with vague linkage (and debugging information) in a particular
12606translation unit.
c1f7febf 12607
fc72b380
JM
12608@emph{Note:} As of GCC 2.7.2, these @code{#pragma}s are not useful in
12609most cases, because of COMDAT support and the ``key method'' heuristic
12610mentioned in @ref{Vague Linkage}. Using them can actually cause your
27ef2cdd 12611program to grow due to unnecessary out-of-line copies of inline
fc72b380
JM
12612functions. Currently (3.4) the only benefit of these
12613@code{#pragma}s is reduced duplication of debugging information, and
12614that should be addressed soon on DWARF 2 targets with the use of
12615COMDAT groups.
c1f7febf
RK
12616
12617@table @code
12618@item #pragma interface
12619@itemx #pragma interface "@var{subdir}/@var{objects}.h"
12620@kindex #pragma interface
12621Use this directive in @emph{header files} that define object classes, to save
12622space in most of the object files that use those classes. Normally,
12623local copies of certain information (backup copies of inline member
12624functions, debugging information, and the internal tables that implement
12625virtual functions) must be kept in each object file that includes class
12626definitions. You can use this pragma to avoid such duplication. When a
12627header file containing @samp{#pragma interface} is included in a
12628compilation, this auxiliary information will not be generated (unless
12629the main input source file itself uses @samp{#pragma implementation}).
12630Instead, the object files will contain references to be resolved at link
12631time.
12632
12633The second form of this directive is useful for the case where you have
12634multiple headers with the same name in different directories. If you
12635use this form, you must specify the same string to @samp{#pragma
12636implementation}.
12637
12638@item #pragma implementation
12639@itemx #pragma implementation "@var{objects}.h"
12640@kindex #pragma implementation
12641Use this pragma in a @emph{main input file}, when you want full output from
12642included header files to be generated (and made globally visible). The
12643included header file, in turn, should use @samp{#pragma interface}.
12644Backup copies of inline member functions, debugging information, and the
12645internal tables used to implement virtual functions are all generated in
12646implementation files.
12647
12648@cindex implied @code{#pragma implementation}
12649@cindex @code{#pragma implementation}, implied
12650@cindex naming convention, implementation headers
12651If you use @samp{#pragma implementation} with no argument, it applies to
12652an include file with the same basename@footnote{A file's @dfn{basename}
12653was the name stripped of all leading path information and of trailing
12654suffixes, such as @samp{.h} or @samp{.C} or @samp{.cc}.} as your source
12655file. For example, in @file{allclass.cc}, giving just
12656@samp{#pragma implementation}
12657by itself is equivalent to @samp{#pragma implementation "allclass.h"}.
12658
12659In versions of GNU C++ prior to 2.6.0 @file{allclass.h} was treated as
12660an implementation file whenever you would include it from
12661@file{allclass.cc} even if you never specified @samp{#pragma
12662implementation}. This was deemed to be more trouble than it was worth,
12663however, and disabled.
12664
c1f7febf
RK
12665Use the string argument if you want a single implementation file to
12666include code from multiple header files. (You must also use
12667@samp{#include} to include the header file; @samp{#pragma
12668implementation} only specifies how to use the file---it doesn't actually
12669include it.)
12670
12671There is no way to split up the contents of a single header file into
12672multiple implementation files.
12673@end table
12674
12675@cindex inlining and C++ pragmas
12676@cindex C++ pragmas, effect on inlining
12677@cindex pragmas in C++, effect on inlining
12678@samp{#pragma implementation} and @samp{#pragma interface} also have an
12679effect on function inlining.
12680
12681If you define a class in a header file marked with @samp{#pragma
fc72b380
JM
12682interface}, the effect on an inline function defined in that class is
12683similar to an explicit @code{extern} declaration---the compiler emits
12684no code at all to define an independent version of the function. Its
12685definition is used only for inlining with its callers.
c1f7febf 12686
84330467 12687@opindex fno-implement-inlines
c1f7febf
RK
12688Conversely, when you include the same header file in a main source file
12689that declares it as @samp{#pragma implementation}, the compiler emits
12690code for the function itself; this defines a version of the function
12691that can be found via pointers (or by callers compiled without
12692inlining). If all calls to the function can be inlined, you can avoid
84330467 12693emitting the function by compiling with @option{-fno-implement-inlines}.
c1f7febf
RK
12694If any calls were not inlined, you will get linker errors.
12695
12696@node Template Instantiation
12697@section Where's the Template?
c1f7febf
RK
12698@cindex template instantiation
12699
12700C++ templates are the first language feature to require more
12701intelligence from the environment than one usually finds on a UNIX
12702system. Somehow the compiler and linker have to make sure that each
12703template instance occurs exactly once in the executable if it is needed,
12704and not at all otherwise. There are two basic approaches to this
962e6e00 12705problem, which are referred to as the Borland model and the Cfront model.
c1f7febf
RK
12706
12707@table @asis
12708@item Borland model
12709Borland C++ solved the template instantiation problem by adding the code
469b759e
JM
12710equivalent of common blocks to their linker; the compiler emits template
12711instances in each translation unit that uses them, and the linker
12712collapses them together. The advantage of this model is that the linker
12713only has to consider the object files themselves; there is no external
12714complexity to worry about. This disadvantage is that compilation time
12715is increased because the template code is being compiled repeatedly.
12716Code written for this model tends to include definitions of all
12717templates in the header file, since they must be seen to be
12718instantiated.
c1f7febf
RK
12719
12720@item Cfront model
12721The AT&T C++ translator, Cfront, solved the template instantiation
12722problem by creating the notion of a template repository, an
469b759e
JM
12723automatically maintained place where template instances are stored. A
12724more modern version of the repository works as follows: As individual
12725object files are built, the compiler places any template definitions and
12726instantiations encountered in the repository. At link time, the link
12727wrapper adds in the objects in the repository and compiles any needed
12728instances that were not previously emitted. The advantages of this
12729model are more optimal compilation speed and the ability to use the
12730system linker; to implement the Borland model a compiler vendor also
c1f7febf 12731needs to replace the linker. The disadvantages are vastly increased
469b759e
JM
12732complexity, and thus potential for error; for some code this can be
12733just as transparent, but in practice it can been very difficult to build
c1f7febf 12734multiple programs in one directory and one program in multiple
469b759e
JM
12735directories. Code written for this model tends to separate definitions
12736of non-inline member templates into a separate file, which should be
12737compiled separately.
c1f7febf
RK
12738@end table
12739
469b759e 12740When used with GNU ld version 2.8 or later on an ELF system such as
2dd76960
JM
12741GNU/Linux or Solaris 2, or on Microsoft Windows, G++ supports the
12742Borland model. On other systems, G++ implements neither automatic
a4b3b54a 12743model.
469b759e 12744
2dd76960 12745A future version of G++ will support a hybrid model whereby the compiler
469b759e
JM
12746will emit any instantiations for which the template definition is
12747included in the compile, and store template definitions and
12748instantiation context information into the object file for the rest.
12749The link wrapper will extract that information as necessary and invoke
12750the compiler to produce the remaining instantiations. The linker will
12751then combine duplicate instantiations.
12752
12753In the mean time, you have the following options for dealing with
12754template instantiations:
c1f7febf
RK
12755
12756@enumerate
d863830b 12757@item
84330467
JM
12758@opindex frepo
12759Compile your template-using code with @option{-frepo}. The compiler will
d863830b
JL
12760generate files with the extension @samp{.rpo} listing all of the
12761template instantiations used in the corresponding object files which
12762could be instantiated there; the link wrapper, @samp{collect2}, will
12763then update the @samp{.rpo} files to tell the compiler where to place
12764those instantiations and rebuild any affected object files. The
12765link-time overhead is negligible after the first pass, as the compiler
12766will continue to place the instantiations in the same files.
12767
12768This is your best option for application code written for the Borland
12769model, as it will just work. Code written for the Cfront model will
12770need to be modified so that the template definitions are available at
12771one or more points of instantiation; usually this is as simple as adding
12772@code{#include <tmethods.cc>} to the end of each template header.
12773
12774For library code, if you want the library to provide all of the template
12775instantiations it needs, just try to link all of its object files
12776together; the link will fail, but cause the instantiations to be
12777generated as a side effect. Be warned, however, that this may cause
12778conflicts if multiple libraries try to provide the same instantiations.
12779For greater control, use explicit instantiation as described in the next
12780option.
12781
c1f7febf 12782@item
84330467
JM
12783@opindex fno-implicit-templates
12784Compile your code with @option{-fno-implicit-templates} to disable the
c1f7febf
RK
12785implicit generation of template instances, and explicitly instantiate
12786all the ones you use. This approach requires more knowledge of exactly
12787which instances you need than do the others, but it's less
12788mysterious and allows greater control. You can scatter the explicit
12789instantiations throughout your program, perhaps putting them in the
12790translation units where the instances are used or the translation units
12791that define the templates themselves; you can put all of the explicit
12792instantiations you need into one big file; or you can create small files
12793like
12794
3ab51846 12795@smallexample
c1f7febf
RK
12796#include "Foo.h"
12797#include "Foo.cc"
12798
12799template class Foo<int>;
12800template ostream& operator <<
12801 (ostream&, const Foo<int>&);
3ab51846 12802@end smallexample
c1f7febf
RK
12803
12804for each of the instances you need, and create a template instantiation
12805library from those.
12806
12807If you are using Cfront-model code, you can probably get away with not
84330467 12808using @option{-fno-implicit-templates} when compiling files that don't
c1f7febf
RK
12809@samp{#include} the member template definitions.
12810
12811If you use one big file to do the instantiations, you may want to
84330467 12812compile it without @option{-fno-implicit-templates} so you get all of the
c1f7febf
RK
12813instances required by your explicit instantiations (but not by any
12814other files) without having to specify them as well.
12815
2dd76960 12816G++ has extended the template instantiation syntax given in the ISO
6d9c4c83 12817standard to allow forward declaration of explicit instantiations
4003d7f9 12818(with @code{extern}), instantiation of the compiler support data for a
e979f9e8 12819template class (i.e.@: the vtable) without instantiating any of its
4003d7f9
JM
12820members (with @code{inline}), and instantiation of only the static data
12821members of a template class, without the support data or member
12822functions (with (@code{static}):
c1f7febf 12823
3ab51846 12824@smallexample
c1f7febf 12825extern template int max (int, int);
c1f7febf 12826inline template class Foo<int>;
4003d7f9 12827static template class Foo<int>;
3ab51846 12828@end smallexample
c1f7febf
RK
12829
12830@item
2dd76960 12831Do nothing. Pretend G++ does implement automatic instantiation
c1f7febf
RK
12832management. Code written for the Borland model will work fine, but
12833each translation unit will contain instances of each of the templates it
12834uses. In a large program, this can lead to an unacceptable amount of code
12835duplication.
c1f7febf
RK
12836@end enumerate
12837
0ded1f18
JM
12838@node Bound member functions
12839@section Extracting the function pointer from a bound pointer to member function
0ded1f18
JM
12840@cindex pmf
12841@cindex pointer to member function
12842@cindex bound pointer to member function
12843
12844In C++, pointer to member functions (PMFs) are implemented using a wide
12845pointer of sorts to handle all the possible call mechanisms; the PMF
12846needs to store information about how to adjust the @samp{this} pointer,
12847and if the function pointed to is virtual, where to find the vtable, and
12848where in the vtable to look for the member function. If you are using
12849PMFs in an inner loop, you should really reconsider that decision. If
12850that is not an option, you can extract the pointer to the function that
12851would be called for a given object/PMF pair and call it directly inside
12852the inner loop, to save a bit of time.
12853
12854Note that you will still be paying the penalty for the call through a
12855function pointer; on most modern architectures, such a call defeats the
161d7b59 12856branch prediction features of the CPU@. This is also true of normal
0ded1f18
JM
12857virtual function calls.
12858
12859The syntax for this extension is
12860
3ab51846 12861@smallexample
0ded1f18
JM
12862extern A a;
12863extern int (A::*fp)();
12864typedef int (*fptr)(A *);
12865
12866fptr p = (fptr)(a.*fp);
3ab51846 12867@end smallexample
0ded1f18 12868
e979f9e8 12869For PMF constants (i.e.@: expressions of the form @samp{&Klasse::Member}),
767094dd 12870no object is needed to obtain the address of the function. They can be
0fb6bbf5
ML
12871converted to function pointers directly:
12872
3ab51846 12873@smallexample
0fb6bbf5 12874fptr p1 = (fptr)(&A::foo);
3ab51846 12875@end smallexample
0fb6bbf5 12876
84330467
JM
12877@opindex Wno-pmf-conversions
12878You must specify @option{-Wno-pmf-conversions} to use this extension.
0ded1f18 12879
5c25e11d
PE
12880@node C++ Attributes
12881@section C++-Specific Variable, Function, and Type Attributes
12882
12883Some attributes only make sense for C++ programs.
12884
12885@table @code
12886@item init_priority (@var{priority})
12887@cindex init_priority attribute
12888
12889
12890In Standard C++, objects defined at namespace scope are guaranteed to be
12891initialized in an order in strict accordance with that of their definitions
12892@emph{in a given translation unit}. No guarantee is made for initializations
12893across translation units. However, GNU C++ allows users to control the
3844cd2e 12894order of initialization of objects defined at namespace scope with the
5c25e11d
PE
12895@code{init_priority} attribute by specifying a relative @var{priority},
12896a constant integral expression currently bounded between 101 and 65535
12897inclusive. Lower numbers indicate a higher priority.
12898
12899In the following example, @code{A} would normally be created before
12900@code{B}, but the @code{init_priority} attribute has reversed that order:
12901
478c9e72 12902@smallexample
5c25e11d
PE
12903Some_Class A __attribute__ ((init_priority (2000)));
12904Some_Class B __attribute__ ((init_priority (543)));
478c9e72 12905@end smallexample
5c25e11d
PE
12906
12907@noindent
12908Note that the particular values of @var{priority} do not matter; only their
12909relative ordering.
12910
60c87482
BM
12911@item java_interface
12912@cindex java_interface attribute
12913
02f52e19 12914This type attribute informs C++ that the class is a Java interface. It may
60c87482 12915only be applied to classes declared within an @code{extern "Java"} block.
02f52e19
AJ
12916Calls to methods declared in this interface will be dispatched using GCJ's
12917interface table mechanism, instead of regular virtual table dispatch.
60c87482 12918
5c25e11d
PE
12919@end table
12920
38bb2b65 12921See also @ref{Namespace Association}.
86098eb8 12922
664a90c0
JM
12923@node Namespace Association
12924@section Namespace Association
86098eb8 12925
fea77ed9
MM
12926@strong{Caution:} The semantics of this extension are not fully
12927defined. Users should refrain from using this extension as its
12928semantics may change subtly over time. It is possible that this
664a90c0 12929extension will be removed in future versions of G++.
fea77ed9 12930
86098eb8
JM
12931A using-directive with @code{__attribute ((strong))} is stronger
12932than a normal using-directive in two ways:
12933
12934@itemize @bullet
12935@item
664a90c0
JM
12936Templates from the used namespace can be specialized and explicitly
12937instantiated as though they were members of the using namespace.
86098eb8
JM
12938
12939@item
12940The using namespace is considered an associated namespace of all
12941templates in the used namespace for purposes of argument-dependent
12942name lookup.
12943@end itemize
12944
664a90c0
JM
12945The used namespace must be nested within the using namespace so that
12946normal unqualified lookup works properly.
12947
86098eb8
JM
12948This is useful for composing a namespace transparently from
12949implementation namespaces. For example:
12950
12951@smallexample
12952namespace std @{
12953 namespace debug @{
12954 template <class T> struct A @{ @};
12955 @}
12956 using namespace debug __attribute ((__strong__));
cd1a8088 12957 template <> struct A<int> @{ @}; // @r{ok to specialize}
86098eb8
JM
12958
12959 template <class T> void f (A<T>);
12960@}
12961
12962int main()
12963@{
cd1a8088 12964 f (std::A<float>()); // @r{lookup finds} std::f
86098eb8
JM
12965 f (std::A<int>());
12966@}
12967@end smallexample
12968
cb68ec50
PC
12969@node Type Traits
12970@section Type Traits
12971
12972The C++ front-end implements syntactic extensions that allow to
12973determine at compile time various characteristics of a type (or of a
12974pair of types).
12975
12976@table @code
12977@item __has_nothrow_assign (type)
b29441ec
PC
12978If @code{type} is const qualified or is a reference type then the trait is
12979false. Otherwise if @code{__has_trivial_assign (type)} is true then the trait
12980is true, else if @code{type} is a cv class or union type with copy assignment
12981operators that are known not to throw an exception then the trait is true,
12982else it is false. Requires: @code{type} shall be a complete type, an array
12983type of unknown bound, or is a @code{void} type.
cb68ec50
PC
12984
12985@item __has_nothrow_copy (type)
12986If @code{__has_trivial_copy (type)} is true then the trait is true, else if
12987@code{type} is a cv class or union type with copy constructors that
12988are known not to throw an exception then the trait is true, else it is false.
12989Requires: @code{type} shall be a complete type, an array type of
12990unknown bound, or is a @code{void} type.
12991
12992@item __has_nothrow_constructor (type)
12993If @code{__has_trivial_constructor (type)} is true then the trait is
12994true, else if @code{type} is a cv class or union type (or array
12995thereof) with a default constructor that is known not to throw an
12996exception then the trait is true, else it is false. Requires:
12997@code{type} shall be a complete type, an array type of unknown bound,
12998or is a @code{void} type.
12999
13000@item __has_trivial_assign (type)
13001If @code{type} is const qualified or is a reference type then the trait is
13002false. Otherwise if @code{__is_pod (type)} is true then the trait is
13003true, else if @code{type} is a cv class or union type with a trivial
13004copy assignment ([class.copy]) then the trait is true, else it is
13005false. Requires: @code{type} shall be a complete type, an array type
13006of unknown bound, or is a @code{void} type.
13007
13008@item __has_trivial_copy (type)
13009If @code{__is_pod (type)} is true or @code{type} is a reference type
13010then the trait is true, else if @code{type} is a cv class or union type
13011with a trivial copy constructor ([class.copy]) then the trait
13012is true, else it is false. Requires: @code{type} shall be a complete
13013type, an array type of unknown bound, or is a @code{void} type.
13014
13015@item __has_trivial_constructor (type)
13016If @code{__is_pod (type)} is true then the trait is true, else if
13017@code{type} is a cv class or union type (or array thereof) with a
13018trivial default constructor ([class.ctor]) then the trait is true,
13019else it is false. Requires: @code{type} shall be a complete type, an
13020array type of unknown bound, or is a @code{void} type.
13021
13022@item __has_trivial_destructor (type)
13023If @code{__is_pod (type)} is true or @code{type} is a reference type then
13024the trait is true, else if @code{type} is a cv class or union type (or
13025array thereof) with a trivial destructor ([class.dtor]) then the trait
13026is true, else it is false. Requires: @code{type} shall be a complete
13027type, an array type of unknown bound, or is a @code{void} type.
13028
13029@item __has_virtual_destructor (type)
13030If @code{type} is a class type with a virtual destructor
13031([class.dtor]) then the trait is true, else it is false. Requires:
13032@code{type} shall be a complete type, an array type of unknown bound,
13033or is a @code{void} type.
13034
13035@item __is_abstract (type)
13036If @code{type} is an abstract class ([class.abstract]) then the trait
13037is true, else it is false. Requires: @code{type} shall be a complete
13038type, an array type of unknown bound, or is a @code{void} type.
13039
13040@item __is_base_of (base_type, derived_type)
13041If @code{base_type} is a base class of @code{derived_type}
13042([class.derived]) then the trait is true, otherwise it is false.
13043Top-level cv qualifications of @code{base_type} and
13044@code{derived_type} are ignored. For the purposes of this trait, a
13045class type is considered is own base. Requires: if @code{__is_class
13046(base_type)} and @code{__is_class (derived_type)} are true and
13047@code{base_type} and @code{derived_type} are not the same type
13048(disregarding cv-qualifiers), @code{derived_type} shall be a complete
13049type. Diagnostic is produced if this requirement is not met.
13050
13051@item __is_class (type)
13052If @code{type} is a cv class type, and not a union type
d1facce0 13053([basic.compound]) the trait is true, else it is false.
cb68ec50
PC
13054
13055@item __is_empty (type)
13056If @code{__is_class (type)} is false then the trait is false.
13057Otherwise @code{type} is considered empty if and only if: @code{type}
13058has no non-static data members, or all non-static data members, if
d1facce0 13059any, are bit-fields of length 0, and @code{type} has no virtual
cb68ec50
PC
13060members, and @code{type} has no virtual base classes, and @code{type}
13061has no base classes @code{base_type} for which
13062@code{__is_empty (base_type)} is false. Requires: @code{type} shall
13063be a complete type, an array type of unknown bound, or is a
13064@code{void} type.
13065
13066@item __is_enum (type)
d1facce0 13067If @code{type} is a cv enumeration type ([basic.compound]) the trait is
cb68ec50
PC
13068true, else it is false.
13069
13070@item __is_pod (type)
13071If @code{type} is a cv POD type ([basic.types]) then the trait is true,
13072else it is false. Requires: @code{type} shall be a complete type,
13073an array type of unknown bound, or is a @code{void} type.
13074
13075@item __is_polymorphic (type)
13076If @code{type} is a polymorphic class ([class.virtual]) then the trait
13077is true, else it is false. Requires: @code{type} shall be a complete
13078type, an array type of unknown bound, or is a @code{void} type.
13079
13080@item __is_union (type)
d1facce0 13081If @code{type} is a cv union type ([basic.compound]) the trait is
cb68ec50
PC
13082true, else it is false.
13083
13084@end table
13085
1f730ff7
ZW
13086@node Java Exceptions
13087@section Java Exceptions
13088
13089The Java language uses a slightly different exception handling model
13090from C++. Normally, GNU C++ will automatically detect when you are
13091writing C++ code that uses Java exceptions, and handle them
13092appropriately. However, if C++ code only needs to execute destructors
13093when Java exceptions are thrown through it, GCC will guess incorrectly.
9c34dbbf 13094Sample problematic code is:
1f730ff7 13095
478c9e72 13096@smallexample
1f730ff7 13097 struct S @{ ~S(); @};
cd1a8088 13098 extern void bar(); // @r{is written in Java, and may throw exceptions}
1f730ff7
ZW
13099 void foo()
13100 @{
13101 S s;
13102 bar();
13103 @}
478c9e72 13104@end smallexample
1f730ff7
ZW
13105
13106@noindent
13107The usual effect of an incorrect guess is a link failure, complaining of
13108a missing routine called @samp{__gxx_personality_v0}.
13109
13110You can inform the compiler that Java exceptions are to be used in a
13111translation unit, irrespective of what it might think, by writing
13112@samp{@w{#pragma GCC java_exceptions}} at the head of the file. This
13113@samp{#pragma} must appear before any functions that throw or catch
13114exceptions, or run destructors when exceptions are thrown through them.
13115
13116You cannot mix Java and C++ exceptions in the same translation unit. It
13117is believed to be safe to throw a C++ exception from one file through
9c34dbbf
ZW
13118another file compiled for the Java exception model, or vice versa, but
13119there may be bugs in this area.
1f730ff7 13120
e6f3b89d
PE
13121@node Deprecated Features
13122@section Deprecated Features
13123
13124In the past, the GNU C++ compiler was extended to experiment with new
767094dd 13125features, at a time when the C++ language was still evolving. Now that
e6f3b89d 13126the C++ standard is complete, some of those features are superseded by
767094dd
JM
13127superior alternatives. Using the old features might cause a warning in
13128some cases that the feature will be dropped in the future. In other
e6f3b89d
PE
13129cases, the feature might be gone already.
13130
13131While the list below is not exhaustive, it documents some of the options
13132that are now deprecated:
13133
13134@table @code
13135@item -fexternal-templates
13136@itemx -falt-external-templates
2dd76960 13137These are two of the many ways for G++ to implement template
767094dd 13138instantiation. @xref{Template Instantiation}. The C++ standard clearly
e6f3b89d 13139defines how template definitions have to be organized across
2dd76960 13140implementation units. G++ has an implicit instantiation mechanism that
e6f3b89d
PE
13141should work just fine for standard-conforming code.
13142
13143@item -fstrict-prototype
13144@itemx -fno-strict-prototype
13145Previously it was possible to use an empty prototype parameter list to
13146indicate an unspecified number of parameters (like C), rather than no
767094dd 13147parameters, as C++ demands. This feature has been removed, except where
38bb2b65 13148it is required for backwards compatibility. @xref{Backwards Compatibility}.
e6f3b89d
PE
13149@end table
13150
ae209f28
NS
13151G++ allows a virtual function returning @samp{void *} to be overridden
13152by one returning a different pointer type. This extension to the
13153covariant return type rules is now deprecated and will be removed from a
13154future version.
13155
8ff24a79
MM
13156The G++ minimum and maximum operators (@samp{<?} and @samp{>?}) and
13157their compound forms (@samp{<?=}) and @samp{>?=}) have been deprecated
32e26ece
GK
13158and are now removed from G++. Code using these operators should be
13159modified to use @code{std::min} and @code{std::max} instead.
8ff24a79 13160
ad1a6d45 13161The named return value extension has been deprecated, and is now
2dd76960 13162removed from G++.
e6f3b89d 13163
82c18d5c 13164The use of initializer lists with new expressions has been deprecated,
2dd76960 13165and is now removed from G++.
ad1a6d45
NS
13166
13167Floating and complex non-type template parameters have been deprecated,
2dd76960 13168and are now removed from G++.
ad1a6d45 13169
90ea7324 13170The implicit typename extension has been deprecated and is now
2dd76960 13171removed from G++.
90ea7324 13172
1eaf20ec 13173The use of default arguments in function pointers, function typedefs
90ea7324 13174and other places where they are not permitted by the standard is
2dd76960 13175deprecated and will be removed from a future version of G++.
82c18d5c 13176
6871294a
JW
13177G++ allows floating-point literals to appear in integral constant expressions,
13178e.g. @samp{ enum E @{ e = int(2.2 * 3.7) @} }
13179This extension is deprecated and will be removed from a future version.
13180
13181G++ allows static data members of const floating-point type to be declared
13182with an initializer in a class definition. The standard only allows
13183initializers for static members of const integral types and const
13184enumeration types so this extension has been deprecated and will be removed
13185from a future version.
13186
e6f3b89d
PE
13187@node Backwards Compatibility
13188@section Backwards Compatibility
13189@cindex Backwards Compatibility
13190@cindex ARM [Annotated C++ Reference Manual]
13191
aee96fe9 13192Now that there is a definitive ISO standard C++, G++ has a specification
767094dd 13193to adhere to. The C++ language evolved over time, and features that
e6f3b89d 13194used to be acceptable in previous drafts of the standard, such as the ARM
767094dd 13195[Annotated C++ Reference Manual], are no longer accepted. In order to allow
aee96fe9 13196compilation of C++ written to such drafts, G++ contains some backwards
767094dd 13197compatibilities. @emph{All such backwards compatibility features are
aee96fe9 13198liable to disappear in future versions of G++.} They should be considered
38bb2b65 13199deprecated. @xref{Deprecated Features}.
e6f3b89d
PE
13200
13201@table @code
13202@item For scope
13203If a variable is declared at for scope, it used to remain in scope until
13204the end of the scope which contained the for statement (rather than just
aee96fe9 13205within the for scope). G++ retains this, but issues a warning, if such a
e6f3b89d
PE
13206variable is accessed outside the for scope.
13207
ad1a6d45 13208@item Implicit C language
630d3d5a 13209Old C system header files did not contain an @code{extern "C" @{@dots{}@}}
767094dd
JM
13210scope to set the language. On such systems, all header files are
13211implicitly scoped inside a C language scope. Also, an empty prototype
e6f3b89d
PE
13212@code{()} will be treated as an unspecified number of arguments, rather
13213than no arguments, as C++ demands.
13214@end table