OK to apply?
2013-08-31 Joern Rennecke <joern.renne...@embecosm.com> Jeremy Bennett <jeremy.benn...@embecosm.com>
* doc/install.texi (--with-cpu): Mention ARC. (arc-*-elf32): New paragraph. (arc-linux-uclibc): Likewise. * doc/md.texi (Machine Constraints): Add ARC part. * doc/invoke.texi: (menu): Add ARC Options. (Machine Dependent Options) <ARC Options>: Add synopsis. (node ARC Options): Add. * doc/extend.texi (long_call / short_call attribute): Add ARC. (ARC Built-in Functions): New section defining generic ARC built-in functions. (ARC SIMD Built-in Functions): New section defining SIMD specific built-in functions. (Declaring Attributes of Functions): Extended description of short_call and long_call attributes for ARC and added index entries. diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 151b7e9..f21efd0 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -2812,16 +2812,27 @@ least version 2.20.1), and GNU C library (at least version 2.11.1). @item interrupt @cindex interrupt handler functions -Use this attribute on the ARM, AVR, CR16, Epiphany, M32C, M32R/D, m68k, MeP, MIPS, -RL78, RX and Xstormy16 ports to indicate that the specified function is an -interrupt handler. The compiler generates function entry and exit -sequences suitable for use in an interrupt handler when this attribute -is present. With Epiphany targets it may also generate a special section with -code to initialize the interrupt vector table. +Use this attribute on the ARC, ARM, AVR, CR16, Epiphany, M32C, M32R/D, +m68k, MeP, MIPS, RL78, RX and Xstormy16 ports to indicate that the +specified function is an interrupt handler. The compiler generates +function entry and exit sequences suitable for use in an interrupt +handler when this attribute is present. With Epiphany targets it may +also generate a special section with code to initialize the interrupt +vector table. Note, interrupt handlers for the Blackfin, H8/300, H8/300H, H8S, MicroBlaze, and SH processors can be specified via the @code{interrupt_handler} attribute. +Note, on the ARC, you must specify the kind of interrupt to be handled +in a parameter to the interrupt attribute like this: + +@smallexample +void f () __attribute__ ((interrupt ("ilink1"))); +@end smallexample + +Permissible values for this parameter are: @w{@code{ilink1}} and +@w{@code{ilink2}}. + Note, on the AVR, the hardware globally disables interrupts when an interrupt is executed. The first instruction of an interrupt handler declared with this attribute is a @code{SEI} instruction to @@ -2991,18 +3002,33 @@ unit. This is to allow easy merging of multiple compilation units into one, for example, by using the link-time optimization. For this reason the attribute is not allowed on types to annotate indirect calls. -@item long_call/short_call +@item long_call/medium_call/short_call +@cindex indirect calls on ARC @cindex indirect calls on ARM -This attribute specifies how a particular function is called on -ARM and Epiphany. Both attributes override the -@option{-mlong-calls} (@pxref{ARM Options}) -command-line switch and @code{#pragma long_calls} settings. The +@cindex indirect calls on Epiphany +These attribute specifies how a particular function is called on +ARC, ARM and Epiphany - with @code{medium_call} being specific to ARC. +These attributes override the +@option{-mlong-calls} (@pxref{ARM Options} and @ref{ARC Options}) +and @option{-mmedium-calls} (@pxref{ARC Options}) +command-line switches and @code{#pragma long_calls} settings. For ARM, the @code{long_call} attribute indicates that the function might be far away from the call site and require a different (more expensive) calling sequence. The @code{short_call} attribute always places the offset to the function from the call site into the @samp{BL} instruction directly. +For ARC, a function marked with the @code{long_call} attribute is +always called using register-indirect jump-and-link instructions, +thereby enabling the called function to be placed anywhere within the +32-bit address space. A function marked with the @code{medium_call} +attribute will always be close enough to be called with an unconditional +branch-and-link instruction, which has a 25-bit offset from +the call site. A function marked with the @code{short_call} +attribute will always be close enough to be called with a conditional +branch-and-link instruction, which has a 21-bit offset from +the call site. + @item longcall/shortcall @cindex functions called via pointer on the RS/6000 and PowerPC On the Blackfin, RS/6000 and PowerPC, the @code{longcall} attribute @@ -8833,6 +8859,8 @@ instructions, but allow the compiler to schedule those calls. @menu * Alpha Built-in Functions:: +* ARC Built-in Functions:: +* ARC SIMD Built-in Functions:: * ARM iWMMXt Built-in Functions:: * ARM NEON Intrinsics:: * AVR Built-in Functions:: @@ -8939,6 +8967,430 @@ void *__builtin_thread_pointer (void) void __builtin_set_thread_pointer (void *) @end smallexample +@node ARC Built-in Functions +@subsection ARC Built-in Functions + +The following built-in functions are provided for ARC targets. The +built-ins generate the corresponding assembly instructions. In the +examples given below, the generated code often requires an operand or +result to be in a register. Where necessary further code will be +generated to ensure this is true, but for brevity this is not +described in each case. + +@emph{Note:} Using a built-in to generate an instruction not supported +by a target may cause problems. At present the compiler is not +guaranteed to detect such misuse, and as a result an internal compiler +error may be generated. + +@deftypefn {Built-in Function} int __builtin_arc_aligned (void *@var{val}, int @var{alignval}) +Return 1 if @var{val} is known to have the byte alignment given +by @var{alignval}, otherwise return 0. +Note that this is different from +@smallexample +__alignof__(*(char *)@var{val}) >= alignval +@end smallexample +because __alignof__ sees only the type of the dereference, wheras +__builtin_arc_align uses alignment information from the pointer +as well as from the pointed-to type. +The information available will depend on optimization level. +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_brk (void) +Generates +@example +brk +@end example +@end deftypefn + +@deftypefn {Built-in Function} {unsigned int} __builtin_arc_core_read (unsigned int @var{regno}) +The operand is the number of a register to be read. Generates: +@example +mov @var{dest}, r@var{regno} +@end example +where the value in @var{dest} will be the result returned from the +built-in. +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_core_write (unsigned int @var{regno}, unsigned int @var{val}) +The first operand is the number of a register to be written, the +second operand is a compile time constant to write into that +register. Generates: +@example +mov r@var{regno}, @var{val} +@end example +@end deftypefn + +@deftypefn {Built-in Function} int __builtin_arc_divaw (int @var{a}, int @var{b}) +Only available if either @option{-mcpu=ARC700} or @option{-meA} is set. +Generates: +@example +divaw @var{dest}, @var{a}, @var{b} +@end example +where the value in @var{dest} will be the result returned from the +built-in. +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_flag (unsigned int @var{a}) +Generates +@example +flag @var{a} +@end example +@end deftypefn + +@deftypefn {Built-in Function} {unsigned int} __builtin_arc_lr (unsigned int @var{auxr}) +The operand, @var{auxv}, is the address of an auxiliary register and +must be a compile time constant. Generates: +@example +lr @var{dest}, [@var{auxr}] +@end example +Where the value in @var{dest} will be the result returned from the +built-in. +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_mul64 (int @var{a}, int @var{b}) +Only available with @option{-mmul64}. Generates: +@example +mul64 @var{a}, @var{b} +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_mulu64 (unsigned int @var{a}, unsigned int @var{b}) +Only available with @option{-mmul64}. Generates: +@example +mulu64 @var{a}, @var{b} +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_nop (void) +Generates: +@example +nop +@end example +@end deftypefn + +@deftypefn {Built-in Function} int __builtin_arc_norm (int @var{src}) +Only valid if the @samp{norm} instruction is available through the +@option{-mnorm} option or by default with @option{-mcpu=ARC700}. +Generates: +@example +norm @var{dest}, @var{src} +@end example +Where the value in @var{dest} will be the result returned from the +built-in. +@end deftypefn + +@deftypefn {Built-in Function} {short int} __builtin_arc_normw (short int @var{src}) +Only valid if the @samp{normw} instruction is available through the +@option{-mnorm} option or by default with @option{-mcpu=ARC700}. +Generates: +@example +normw @var{dest}, @var{src} +@end example +Where the value in @var{dest} will be the result returned from the +built-in. +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_rtie (void) +Generates: +@example +rtie +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_sleep (int @var{a} +Generates: +@example +sleep @var{a} +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_sr (unsigned int @var{auxr}, unsigned int @var{val}) +The first argument, @var{auxv}, is the address of an auxiliary +register, the second argument, @var{val}, is a compile time constant +to be written to the register. Generates: +@example +sr @var{auxr}, [@var{val}] +@end example +@end deftypefn + +@deftypefn {Built-in Function} int __builtin_arc_swap (int @var{src}) +Only valid with @option{-mswap}. Generates: +@example +swap @var{dest}, @var{src} +@end example +Where the value in @var{dest} will be the result returned from the +built-in. +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_swi (void) +Generates: +@example +swi +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_sync (void) +Only available with @option{-mcpu=ARC700}. Generates: +@example +sync +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_trap_s (unsigned int @var{c}) +Only available with @option{-mcpu=ARC700}. Generates: +@example +trap_s @var{c} +@end example +@end deftypefn + +@deftypefn {Built-in Function} void __builtin_arc_unimp_s (void) +Only available with @option{-mcpu=ARC700}. Generates: +@example +unimp_s +@end example +@end deftypefn + +The instructions generated by the following builtins are not +considered as candidates for scheduling. They are not moved around by +the compiler during scheduling, and thus can be expected to appear +where they are put in the C code: +@example +__builtin_arc_brk() +__builtin_arc_core_read() +__builtin_arc_core_write() +__builtin_arc_flag() +__builtin_arc_lr() +__builtin_arc_sleep() +__builtin_arc_sr() +__builtin_arc_swi() +@end example + +@node ARC SIMD Built-in Functions +@subsection ARC SIMD Built-in Functions + +SIMD builtins provided by the compiler can be used to generate the +vector instructions. This section describes the available builtins +and their usage in programs. With the @option{-msimd} option, the +compiler provides 128-bit vector types, which can be specified using +the @code{vector_size} attribute. The header file @file{arc-simd.h} +can be included to use the following predefined types: +@example +typedef int __v4si __attribute__((vector_size(16))); +typedef short __v8hi __attribute__((vector_size(16))); +@end example + +These types can be used to define 128-bit variables. The built-in +functions listed in the following section can be used on these +variables to generate the vector operations. + +For all builtins, @code{__builtin_arc_@var{someinsn}}, the header file +@file{arc-simd.h} also provides equivalent macros called +@code{_@var{someinsn}} that can be used for programming ease and +improved readability. The following macros for DMA control are also +provided: +@example +#define _setup_dma_in_channel_reg _vdiwr +#define _setup_dma_out_channel_reg _vdowr +@end example + +The following is a complete list of all the SIMD built-ins provided +for ARC, grouped by calling signature. + +The following take two @code{__v8hi} arguments and return a +@code{__v8hi} result: +@example +__v8hi __builtin_arc_vaddaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vaddw (__v8hi, __v8hi) +__v8hi __builtin_arc_vand (__v8hi, __v8hi) +__v8hi __builtin_arc_vandaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vavb (__v8hi, __v8hi) +__v8hi __builtin_arc_vavrb (__v8hi, __v8hi) +__v8hi __builtin_arc_vbic (__v8hi, __v8hi) +__v8hi __builtin_arc_vbicaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vdifaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vdifw (__v8hi, __v8hi) +__v8hi __builtin_arc_veqw (__v8hi, __v8hi) +__v8hi __builtin_arc_vh264f (__v8hi, __v8hi) +__v8hi __builtin_arc_vh264ft (__v8hi, __v8hi) +__v8hi __builtin_arc_vh264fw (__v8hi, __v8hi) +__v8hi __builtin_arc_vlew (__v8hi, __v8hi) +__v8hi __builtin_arc_vltw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmaxaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmaxw (__v8hi, __v8hi) +__v8hi __builtin_arc_vminaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vminw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr1aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr1w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr2aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr2w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr3aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr3w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr4aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr4w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr5aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr5w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr6aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr6w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr7aw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmr7w (__v8hi, __v8hi) +__v8hi __builtin_arc_vmrb (__v8hi, __v8hi) +__v8hi __builtin_arc_vmulaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmulfaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmulfw (__v8hi, __v8hi) +__v8hi __builtin_arc_vmulw (__v8hi, __v8hi) +__v8hi __builtin_arc_vnew (__v8hi, __v8hi) +__v8hi __builtin_arc_vor (__v8hi, __v8hi) +__v8hi __builtin_arc_vsubaw (__v8hi, __v8hi) +__v8hi __builtin_arc_vsubw (__v8hi, __v8hi) +__v8hi __builtin_arc_vsummw (__v8hi, __v8hi) +__v8hi __builtin_arc_vvc1f (__v8hi, __v8hi) +__v8hi __builtin_arc_vvc1ft (__v8hi, __v8hi) +__v8hi __builtin_arc_vxor (__v8hi, __v8hi) +__v8hi __builtin_arc_vxoraw (__v8hi, __v8hi) +@end example + +The following take one @code{__v8hi} and one @code{int} argument and return a +@code{__v8hi} result: + +@example +__v8hi __builtin_arc_vbaddw (__v8hi, int) +__v8hi __builtin_arc_vbmaxw (__v8hi, int) +__v8hi __builtin_arc_vbminw (__v8hi, int) +__v8hi __builtin_arc_vbmulaw (__v8hi, int) +__v8hi __builtin_arc_vbmulfw (__v8hi, int) +__v8hi __builtin_arc_vbmulw (__v8hi, int) +__v8hi __builtin_arc_vbrsubw (__v8hi, int) +__v8hi __builtin_arc_vbsubw (__v8hi, int) +@end example + +The following take one @code{__v8hi} argument and one @code{int} argument which +must be a 3-bit compile time constant indicating a register number +I0-I7. They return a @code{__v8hi} result. +@example +__v8hi __builtin_arc_vasrw (__v8hi, const int) +__v8hi __builtin_arc_vsr8 (__v8hi, const int) +__v8hi __builtin_arc_vsr8aw (__v8hi, const int) +@end example + +The following take one @code{__v8hi} argument and one @code{int} +argument which must be a 6-bit compile time constant. They return a +@code{__v8hi} result. +@example +__v8hi __builtin_arc_vasrpwbi (__v8hi, const int) +__v8hi __builtin_arc_vasrrpwbi (__v8hi, const int) +__v8hi __builtin_arc_vasrrwi (__v8hi, const int) +__v8hi __builtin_arc_vasrsrwi (__v8hi, const int) +__v8hi __builtin_arc_vasrwi (__v8hi, const int) +__v8hi __builtin_arc_vsr8awi (__v8hi, const int) +__v8hi __builtin_arc_vsr8i (__v8hi, const int) +@end example + +The following take one @code{__v8hi} argument and one @code{int} argument which +must be a 8-bit compile time constant. They return a @code{__v8hi} +result. +@example +__v8hi __builtin_arc_vd6tapf (__v8hi, const int) +__v8hi __builtin_arc_vmvaw (__v8hi, const int) +__v8hi __builtin_arc_vmvw (__v8hi, const int) +__v8hi __builtin_arc_vmvzw (__v8hi, const int) +@end example + +The following take two @code{int} arguments, the second of which which +must be a 8-bit compile time constant. They return a @code{__v8hi} +result: +@example +__v8hi __builtin_arc_vmovaw (int, const int) +__v8hi __builtin_arc_vmovw (int, const int) +__v8hi __builtin_arc_vmovzw (int, const int) +@end example + +The following take a single @code{__v8hi} argument and return a +@code{__v8hi} result: +@example +__v8hi __builtin_arc_vabsaw (__v8hi) +__v8hi __builtin_arc_vabsw (__v8hi) +__v8hi __builtin_arc_vaddsuw (__v8hi) +__v8hi __builtin_arc_vexch1 (__v8hi) +__v8hi __builtin_arc_vexch2 (__v8hi) +__v8hi __builtin_arc_vexch4 (__v8hi) +__v8hi __builtin_arc_vsignw (__v8hi) +__v8hi __builtin_arc_vupbaw (__v8hi) +__v8hi __builtin_arc_vupbw (__v8hi) +__v8hi __builtin_arc_vupsbaw (__v8hi) +__v8hi __builtin_arc_vupsbw (__v8hi) +@end example + +The followign take two @code{int} arguments and return no result: +@example +void __builtin_arc_vdirun (int, int) +void __builtin_arc_vdorun (int, int) +@end example + +The following take two @code{int} arguments and return no result. The +first argument must a 3-bit compile time constant indicating one of +the DR0-DR7 DMA setup channels: +@example +void __builtin_arc_vdiwr (const int, int) +void __builtin_arc_vdowr (const int, int) +@end example + +The following take an @code{int} argument and return no result: +@example +void __builtin_arc_vendrec (int) +void __builtin_arc_vrec (int) +void __builtin_arc_vrecrun (int) +void __builtin_arc_vrun (int) +@end example + +The following take a @code{__v8hi} argument and two @code{int} +arguments and return a @code{__v8hi} result. The second argument must +be a 3-bit compile time constants, indicating one the registers I0-I7, +and the third argument must be an 8-bit compile time constant. + +@emph{Note:} Although the equivalent hardware instructions do not take +an SIMD register as an operand, these builtins overwrite the relevant +bits of the @code{__v8hi} register provided as the first argument with +the value loaded from the @code{[Ib, u8]} location in the SDM. + +@example +__v8hi __builtin_arc_vld32 (__v8hi, const int, const int) +__v8hi __builtin_arc_vld32wh (__v8hi, const int, const int) +__v8hi __builtin_arc_vld32wl (__v8hi, const int, const int) +__v8hi __builtin_arc_vld64 (__v8hi, const int, const int) +@end example + +The following take two @code{int} arguments and return a @code{__v8hi} +result. The first argument must be a 3-bit compile time constants, +indicating one the registers I0-I7, and the second argument must be an +8-bit compile time constant. + +@example +__v8hi __builtin_arc_vld128 (const int, const int) +__v8hi __builtin_arc_vld64w (const int, const int) +@end example + +The following take a @code{__v8hi} argument and two @code{int} +arguments and return no result. The second argument must be a 3-bit +compile time constants, indicating one the registers I0-I7, and the +third argument must be an 8-bit compile time constant. + +@example +void __builtin_arc_vst128 (__v8hi, const int, const int) +void __builtin_arc_vst64 (__v8hi, const int, const int) +@end example + +The following take a @code{__v8hi} argument and three @code{int} +arguments and return no result. The second argument must be a 3-bit +compile-time constant, identifying the 16-bit sub-register to be +stored, the third argument must be a 3-bit compile time constants, +indicating one the registers I0-I7, and the fourth argument must be an +8-bit compile time constant. + +@example +void __builtin_arc_vst16_n (__v8hi, const int, const int, const int) +void __builtin_arc_vst32_n (__v8hi, const int, const int, const int) +@end example + @node ARM iWMMXt Built-in Functions @subsection ARM iWMMXt Built-in Functions @@ -16751,3 +17203,6 @@ implicitly scoped inside a C language scope. Also, an empty prototype @code{()} is treated as an unspecified number of arguments, rather than no arguments, as C++ demands. @end table + +@c LocalWords: emph deftypefn builtin ARCv2EM SIMD builtins msimd +@c LocalWords: typedef v4si v8hi DMA dma vdiwr vdowr followign diff --git a/gcc/doc/install.texi b/gcc/doc/install.texi index 221e60e..3ad5a86 100644 --- a/gcc/doc/install.texi +++ b/gcc/doc/install.texi @@ -1188,8 +1188,8 @@ This is an alias for @option{--enable-tls=no}. @itemx --with-cpu-64=@var{cpu} Specify which cpu variant the compiler should generate code for by default. @var{cpu} will be used as the default value of the @option{-mcpu=} switch. -This option is only supported on some targets, including ARM, i386, M68k, -PowerPC, and SPARC@. The @option{--with-cpu-32} and +This option is only supported on some targets, including ARC, ARM, i386, M68k, +PowerPC, and SPARC@. It is mandatory for ARC@. The @option{--with-cpu-32} and @option{--with-cpu-64} options specify separate default CPUs for 32-bit and 64-bit modes; these options are only supported for i386, x86-64 and PowerPC. @@ -3192,6 +3192,22 @@ This is a synonym for @samp{x86_64-*-solaris2.1[0-9]*}. @html <hr /> @end html +@heading @anchor{arc-x-elf32}arc-*-elf32 + +Use @samp{configure --target=arc-elf32 --with-cpu=@var{cpu} --enable-languages="c,c++"} +to configure GCC, with @var{cpu} being one of @samp{arc600}, @samp{arc601}, +or @samp{arc700}@. + +@html +<hr /> +@end html +@heading @anchor{arc-linux-uclibc}arc-linux-uclibc + +Use @samp{configure --target=arc-linux-uclibc --with-cpu=arc700 --enable-languages="c,c++"} to configure GCC@. + +@html +<hr /> +@end html @heading @anchor{arm-x-eabi}arm-*-eabi ARM-family processors. Subtargets that use the ELF object format require GNU binutils 2.13 or newer. Such subtargets include: diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 9dfb4d7..aa7342d 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -489,6 +489,23 @@ Objective-C and Objective-C++ Dialects}. -mfp-mode=@var{mode} -mvect-double -max-vect-align=@var{num} @gol -msplit-vecmove-early -m1reg-@var{reg}} +@emph{ARC Options} +@gccoptlist{-mbarrel-shifter @gol +-mcpu=@var{cpu} -mA6 -mARC600 -mA7 -mARC700 @gol +-mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr @gol +-mea -mno-mpy -mmul32x16 -mmul64 @gol +-mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap @gol +-mcrc -mdsp-packa -mdvbf -mlock -mmac-d16 -mmac-24 -mrtsc -mswape @gol +-mtelephony -mxy -misize -mannotate-align -marclinux -marclinux_prof @gol +-mepilogue-cfi -mlong-calls -mmedium-calls -msdata @gol +-mucb-mcount -mvolatile-cache @gol +-malign-call -mauto-modify-reg -mbbit-peephole -mno-brcc @gol +-mcase-vector-pcrel -mcompact-casesi -mno-cond-exec -mearly-cbranchsi @gol +-mexpand-adddi -mindexed-loads -mlra -mlra-priority-none @gol +-mlra-priority-compact mlra-priority-noncompact -mno-millicode @gol +-mmixed-code -mq-class -mRcq -mRcw -msize-level=@var{level} @gol +-mtune=@var{cpu} -mmultcost=@var{num} -munalign-prob-threshold=@var{probability}} + @emph{ARM Options} @gccoptlist{-mapcs-frame -mno-apcs-frame @gol -mabi=@var{name} @gol @@ -11001,6 +11018,7 @@ platform. @menu * AArch64 Options:: * Adapteva Epiphany Options:: +* ARC Options:: * ARM Options:: * AVR Options:: * Blackfin Options:: @@ -11339,6 +11357,511 @@ purpose. The default is @option{-m1reg-none}. @end table +@node ARC Options +@subsection ARC Options +@cindex ARC options + +The following options control the architecture variant for which code +is being compiled: + +@c architecture variants +@table @gcctabopt + +@item -mbarrel-shifter +@opindex mbarrel-shifter +Generate instructions supported by barrel shifter. This is the default +unless @samp{-mcpu=ARC601} is in effect. + +@item -mcpu=@var{cpu} +@opindex mcpu +Set architecture type, register usage, and instruction scheduling +parameters for @var{cpu}. There are also shortcut alias options +available for backward compatibility and convenience. Supported +values for @var{cpu} are + +@table @samp +@opindex mA6 +@opindex mARC600 +@item ARC600 +Compile for ARC600. Aliases: @option{-mA6}, @option{-mARC600}. + +@item ARC601 +@opindex mARC601 +Compile for ARC601. Alias: @option{-mARC601}. + +@item ARC700 +@opindex mA7 +@opindex mARC700 +Compile for ARC700. Aliases: @option{-mA7}, @option{-mARC700}. +This is the default when configured with @samp{--with-cpu=arc700}@. +@end table + +@item -mdpfp +@opindex mdpfp +@itemx -mdpfp-compact +@opindex mdpfp-compact +FPX: Generate Double Precision FPX instructions, tuned for the compact +implementation. + +@item -mdpfp-fast +@opindex mdpfp-fast +FPX: Generate Double Precision FPX instructions, tuned for the fast +implementation. + +@item -mno-dpfp-lrsr +@opindex mno-dpfp-lrsr +Disable LR and SR instructions from using FPX extension aux registers. + +@item -mea +@opindex mea +Generate Extended arithmetic instructions. Currently only +@code{divaw}, @code{adds}, @code{subs}, and @code{sat16} are +supported. This is always enabled for @samp{-mcpu=ARC700}. + +@item -mno-mpy +@opindex mno-mpy +Do not generate mpy instructions for ARC700. + +@item -mmul32x16 +@opindex mmul32x16 +Generate 32x16 bit multiply and mac instructions. + +@item -mmul64 +@opindex mmul64 +Generate mul64 and mulu64 instructions. Only valid for @samp{-mcpu=ARC600}. + +@item -mnorm +@opindex mnorm +Generate norm instruction. This is the default if @samp{-mcpu=ARC700} +is in effect. + +@item -mspfp +@opindex mspfp +@itemx -mspfp-compact +@opindex mspfp-compact +FPX: Generate Single Precision FPX instructions, tuned for the compact +implementation. + +@item -mspfp-fast +@opindex mspfp-fast +FPX: Generate Single Precision FPX instructions, tuned for the fast +implementation. + +@item -msimd +@opindex msimd +Enable generation of ARC SIMD instructions via target-specific +builtins. Only valid for @samp{-mcpu=ARC700}. + +@item -msoft-float +@opindex msoft-float +This option ignored; it is provided for compatibility purposes only. +Software floating point code is emitted by default, and this default +can overridden by FPX options; @samp{mspfp}, @samp{mspfp-compact}, or +@samp{mspfp-fast} for single precision, and @samp{mdpfp}, +@samp{mdpfp-compact}, or @samp{mdpfp-fast} for double precision. + +@item -mswap +@opindex mswap +Generate swap instructions. + +@end table + +The following options are passed through to the assembler, and also +define preprocessor macro symbols. + +@c Flags used by the assembler, but for which we define preprocessor +@c macro symbols as well. +@table @gcctabopt +@item -mdsp-packa +@opindex mdsp-packa +Passed down to the assembler to enable the DSP Pack A extensions. +Also sets the preprocessor symbol @code{__Xdsp_packa}. + +@item -mdvbf +@opindex mdvbf +Passed down to the assembler to enable the dual viterbi butterfly +extension. Also sets the preprocessor symbol @code{__Xdvbf}. + +@c ARC700 4.10 extension instruction +@item -mlock +@opindex mlock +Passed down to the assembler to enable the Locked Load/Store +Conditional extension. Also sets the preprocessor symbol +@code{__Xlock}. + +@item -mmac-d16 +@opindex mmac-d16 +Passed down to the assembler. Also sets the preprocessor symbol +@code{__Xxmac_d16}. + +@item -mmac-24 +@opindex mmac-24 +Passed down to the assembler. Also sets the preprocessor symbol +@code{__Xxmac_24}. + +@c ARC700 4.10 extension instruction +@item -mrtsc +@opindex mrtsc +Passed down to the assembler to enable the 64-bit Time-Stamp Counter +extension instruction. Also sets the preprocessor symbol +@code{__Xrtsc}. + +@c ARC700 4.10 extension instruction +@item -mswape +@opindex mswape +Passed down to the assembler to enable the swap byte ordering +extension instruction. Also sets the preprocessor symbol +@code{__Xswape}. + +@item -mtelephony +@opindex mtelephony +Passed down to the assembler to enable dual and single operand +instructions for telephony. Also sets the preprocessor symbol +@code{__Xtelephony}. + +@item -mxy +@opindex mxy +Passed down to the assembler to enable the XY Memory extension. Also +sets the preprocessor symbol @code{__Xxy}. + +@end table + +The following options control how the assembly code is annotated: + +@c Assembly annotation options +@table @gcctabopt +@item -misize +@opindex misize +Annotate assembler instructions with estimated addresses. + +@item -mannotate-align +@opindex mannotate-align +Explain what alignment considerations lead to the decision to make an +instruction short or long. + +@end table + +The following options are passed through to the linker: + +@c options passed through to the linker +@table @gcctabopt +@item -marclinux +@opindex marclinux +Passed through to the linker, to specify use of the @code{arclinux} emulation. +This option is enabled by default in tool chains built for +@w{@code{arc-linux-uclibc}} and @w{@code{arceb-linux-uclibc}} targets +when profiling is not requested. + +@item -marclinux_prof +@opindex marclinux_prof +Passed through to the linker, to specify use of the +@code{arclinux_prof} emulation. This option is enabled by default in +tool chains built for @w{@code{arc-linux-uclibc}} and +@w{@code{arceb-linux-uclibc}} targets when profiling is requested. + +@end table + +The following options control the semantics of generated code: + +@c semantically relevant code generation options +@table @gcctabopt +@item -mepilogue-cfi +@opindex mepilogue-cfi +Enable generation of call frame information for epilogues. + +@item -mno-epilogue-cfi +@opindex mno-epilogue-cfi +Disable generation of call frame information for epilogues. + +@item -mlong-calls +@opindex mlong-calls +Generate call insns as register indirect calls, thus providing access +to the full 32-bit address range. + +@item -mmedium-calls +@opindex mmedium-calls +Don't use less than 25 bit addressing range for calls, which is the +offset available for an unconditional branch-and-link +instruction. Conditional execution of function calls is suppressed, to +allow use of the 25-bit range, rather than the 21-bit range with +conditional branch-and-link. This is the default for tool chains built +for @w{@code{arc-linux-uclibc}} and @w{@code{arceb-linux-uclibc}} targets. + +@item -mno-sdata +@opindex mno-sdata +Do not generate sdata references. This is the default for tool chains +built for @w{@code{arc-linux-uclibc}} and @w{@code{arceb-linux-uclibc}} +targets. + +@item -mucb-mcount +@opindex mucb-mcount +Instrument with mcount calls as used in UCB code. I.e. do the +counting in the callee, not the caller. By default ARC instrumentation +counts in the caller. + +@item -mvolatile-cache +@opindex mvolatile-cache +Use ordinarily cached memory accesses for volatile references. This is the +default. + +@item -mno-volatile-cache +@opindex mno-volatile-cache +Enable cache bypass for volatile references. + +@end table + +The following options fine tune code generation: +@c code generation tuning options +@table @gcctabopt +@item -malign-call +@opindex malign-call +Do alignment optimizations for call instructions. + +@item -mauto-modify-reg +@opindex mauto-modify-reg +Enable the use of pre/post modify with register displacement. + +@item -mbbit-peephole +@opindex mbbit-peephole +Enable bbit peephole2. + +@item -mno-brcc +@opindex mno-brcc +This option disables a target-specific pass in @file{arc_reorg} to +generate @code{BRcc} instructions. It has no effect on @code{BRcc} +generation driven by the combiner pass. + +@item -mcase-vector-pcrel +@opindex mcase-vector-pcrel +Use pc-relative switch case tables - this enables case table shortening. +This is the default for @option{-Os}. + +@item -mcompact-casesi +@opindex mcompact-casesi +Enable compact casesi pattern. +This is the default for @option{-Os}. + +@item -mno-cond-exec +@opindex mno-cond-exec +Disable ARCompact specific pass to generate conditional execution instructions. +Due to delay slot scheduling and interactions between operand numbers, +literal sizes, instruction lengths, and the support for conditional execution, +the target-independent pass to generate conditional execution is often lacking, +so the ARC port has kept a special pass around that tries to find more +conditional execution generating opportunities after register allocation, +branch shortening, and delay slot scheduling have been done. This pass +generally, but not always, improves performance and code size, at the cost of +extra compilation time, which is why there is an option to switch it off. +If you have a problem with call instructions exceeding their allowable +offset range because they are conditionalized, you should consider using +@option{-mmedium-calls} instead. + +@item -mearly-cbranchsi +@opindex mearly-cbranchsi +Enable pre-reload use of the cbranchsi pattern. + +@item -mexpand-adddi +@opindex mexpand-adddi +Expand @code{adddi3} and @code{subdi3} at rtl generation time into +@code{add.f}, @code{adc} etc. + +@item -mindexed-loads +@opindex mindexed-loads +Enable the use of indexed loads. This can be problematic because some +optimizers will then assume the that indexed stores exist, which is not +the case. + +@item -mlra +@opindex mlra +Enable Local Register Allocation. This is still experimental for ARC, +so by default the compiler uses standard reload +(i.e. @samp{-mno-lra}). + +@item -mlra-priority-none +@opindex mlra-priority-none +Don't indicate any priority for target registers. + +@item -mlra-priority-compact +@opindex mlra-priority-compact +Indicate target register priority for r0..r3 / r12..r15. + +@item -mlra-priority-noncompact +@opindex mlra-priority-noncompact +Reduce target regsiter priority for r0..r3 / r12..r15. + +@item -mno-millicode +@opindex mno-millicode +When optimizing for size (using @option{-Os}), prologues and epilogues +that have to save or restore a large number of registers are often +shortened by using call to a special function in libgcc; this is +referred to as a @emph{millicode} call. As these calls can pose +performance issues, and/or cause linking issues when linking in a +nonstandard way, this option is provided to turn off millicode call +generation. + +@item -mmixed-code +@opindex mmixed-code +Tweak register allocation to help 16-bit instruction generation. +This generally has the effect of decreasing the average instruction size +while increasing the instruction count. + +@item -mq-class +@opindex mq-class +Enable 'q' instruction alternatives. +This is the default for @option{-Os}. + +@item -mRcq +@opindex mRcq +Enable Rcq constraint handling - most short code generation depends on this. +This is the default. + +@item -mRcw +@opindex mRcw +Enable Rcw constraint handling - ccfsm condexec mostly depends on this. +This is the default. + +@item -msize-level=@var{level} +@ opindex msize-level +Fine-tune size optimization with regards to instruction lengths and alignment. +The recognized values for @var{level} are: +@table @samp +@item 0 +No size optimization. This level is deprecated and treated like @samp{1}. + +@item 1 +Short instructions are used opportunistically. + +@item 2 +In addition, alignment of loops and of code after barriers are dropped. + +@item 3 +In addition, optional data alignment is dropped, and the option @option{Os} is enabled. + +@end table + +This defaults to @samp{3} when @option{-Os} is in effect. Otherwise, +the behavior when this is not set is equivalent to level @samp{1}. + +@item -mtune=@var{cpu} +@opindex mtune +Set instruction scheduling parameters for @var{cpu}, overriding any implied +by @option{-mcpu=}. + +Supported values for @var{cpu} are + +@table @samp +@item ARC600 +Tune for ARC600 cpu. + +@item ARC601 +Tune for ARC601 cpu. + +@item ARC700 +Tune for ARC700 cpu with standard multiplier block. + +@item ARC700-xmac +Tune for ARC700 cpu with XMAC block. + +@item ARC725D +Tune for ARC725D cpu. + +@item ARC750D +Tune for ARC750D cpu. + +@end table + +@item -mmultcost=@var{num} +@opindex mmultcost +Cost to assume for a multiply instruction, with @samp{4} being equal to a +normal instruction. + +@item -munalign-prob-threshold=@var{probability} +@opindex munalign-prob-threshold +Set probability threshold for unaligning branches. +When tuning for @samp{ARC700} and optimizing for speed, branches without +filled delay slot are preferably emitted unaligned and long, unless +profiling indicates that the probability for the branch to be taken +is below @var{probability}. @xref{Cross-profiling}. +The default is (REG_BR_PROB_BASE/2), i.e.@: 5000. + +@end table + +The following options are maintained for backward compatibility, but +are now deprecated and will be removed in a future release: + +@c Deprecated options +@table @gcctabopt + +@item -margonaut +@opindex margonaut +Obsolete FPX. + +@item -mbig-endian +@opindex mbig-endian +@itemx -EB +@opindex EB +Compile code for big endian targets. Use of these options is now +deprecated. Users wanting big-endian code, should use the +@w{@code{arceb-elf32}} and @w{@code{arceb-linux-uclibc}} targets when +building the tool chain, for which big-endian is the default. + +@item -mlittle-endian +@opindex mlittle-endian +@itemx -EL +@opindex EL +Compile code for little endian targets. Use of these options is now +deprecated. Users wanting little-endian code should use the +@w{@code{arc-elf32}} and @w{@code{arc-linux-uclibc}} targets when +building the tool chain, for which little-endian is the default. + +@item -mbarrel_shifter +@opindex mbarrel_shifter +Replaced by @samp{-mbarrel-shifter} + +@item -mdpfp_compact +@opindex mdpfp_compact +Replaced by @samp{-mdpfp-compact} + +@item -mdpfp_fast +@opindex mdpfp_fast +Replaced by @samp{-mdpfp-fast} + +@item -mdsp_packa +@opindex mdsp_packa +Replaced by @samp{-mdsp-packa} + +@item -mEA +@opindex mEA +Replaced by @samp{-mea} + +@item -mmac_24 +@opindex mmac_24 +Replaced by @samp{-mmac-24} + +@item -mmac_d16 +@opindex mmac_d16 +Replaced by @samp{-mmac-d16} + +@item -mspfp_compact +@opindex mspfp_compact +Replaced by @samp{-mspfp-compact} + +@item -mspfp_fast +@opindex mspfp_fast +Replaced by @samp{-mspfp-fast} + +@item -mtune=@var{cpu} +@opindex mtune +Values @samp{arc600}, @samp{arc601}, @samp{arc700} and +@samp{arc700-xmac} for @var{cpu} are replaced by @samp{ARC600}, +@samp{ARC601}, @samp{ARC700} and @samp{ARC700-xmac} respectively + +@item -multcost=@var{num} +@opindex multcost +Replaced by @samp{-mmultcost}. + +@end table + @node ARM Options @subsection ARM Options @cindex ARM options diff --git a/gcc/doc/md.texi b/gcc/doc/md.texi index 04f76fe..3cbaf63 100644 --- a/gcc/doc/md.texi +++ b/gcc/doc/md.texi @@ -1725,6 +1725,54 @@ DF modes @end table +@item ARC ---@file{config/arc/constraints.md} +@table @code +@item q +Registers usable in ARCompact 16-bit instructions: @code{r0}-@code{r3}, +@code{r12}-@code{r15}. This constraint can only match when the @option{-mq} +option is in effect. + +@item e +Registers usable as base-regs of memory addresses in ARCompact 16-bit memory +instructions: @code{r0}-@code{r3}, @code{r12}-@code{r15}, @code{sp}. +This constraint can only match when the @option{-mq} +option is in effect. +@item D +ARC FPX (dpfp) 64-bit registers. @code{D0}, @code{D1}. + +@item I +A signed 12-bit integer constant. + +@item Cal +constant for arithmetic/logical operations. This might be any constant +that can be put into a long immediate by the assmbler or linker without +involving a PIC relocation. + +@item K +A 3-bit unsigned integer constant. + +@item L +A 6-bit unsigned integer constant. + +@item CnL +One's complement of a 6-bit unsigned integer constant. + +@item CmL +Two's complement of a 6-bit unsigned integer constant. + +@item M +A 5-bit unsigned integer constant. + +@item O +A 7-bit unsigned integer constant. + +@item P +A 8-bit unsigned integer constant. + +@item H +Any const_double value. +@end table + @item ARM family---@file{config/arm/constraints.md} @table @code @item w