@c Copyright (C) 2000-2018 Free Software Foundation, Inc. @c This is part of the GAS manual. @c For copying conditions, see the file as.texinfo. @ifset GENERIC @page @node ARC-Dependent @chapter ARC Dependent Features @end ifset @ifclear GENERIC @node Machine Dependencies @chapter ARC Dependent Features @end ifclear @set ARC_CORE_DEFAULT 6 @cindex ARC support @menu * ARC Options:: Options * ARC Syntax:: Syntax * ARC Directives:: ARC Machine Directives * ARC Modifiers:: ARC Assembler Modifiers * ARC Symbols:: ARC Pre-defined Symbols * ARC Opcodes:: Opcodes @end menu @node ARC Options @section Options @cindex ARC options @cindex options for ARC The following options control the type of CPU for which code is assembled, and generic constraints on the code generated: @table @code @item -mcpu=@var{cpu} @cindex @code{-mcpu=@var{cpu}} command line option, ARC Set architecture type and register usage for @var{cpu}. There are also shortcut alias options available for backward compatibility and convenience. Supported values for @var{cpu} are @table @code @cindex @code{mA6} command line option, ARC @cindex @code{marc600} command line option, ARC @item arc600 Assemble for ARC 600. Aliases: @code{-mA6}, @code{-mARC600}. @item arc600_norm Assemble for ARC 600 with norm instructions. @item arc600_mul64 Assemble for ARC 600 with mul64 instructions. @item arc600_mul32x16 Assemble for ARC 600 with mul32x16 instructions. @item arc601 @cindex @code{mARC601} command line option, ARC Assemble for ARC 601. Alias: @code{-mARC601}. @item arc601_norm Assemble for ARC 601 with norm instructions. @item arc601_mul64 Assemble for ARC 601 with mul64 instructions. @item arc601_mul32x16 Assemble for ARC 601 with mul32x16 instructions. @item arc700 @cindex @code{mA7} command line option, ARC @cindex @code{mARC700} command line option, ARC Assemble for ARC 700. Aliases: @code{-mA7}, @code{-mARC700}. @item arcem @cindex @code{mEM} command line option, ARC Assemble for ARC EM. Aliases: @code{-mEM} @item em Assemble for ARC EM, identical as arcem variant. @item em4 Assemble for ARC EM with code-density instructions. @item em4_dmips Assemble for ARC EM with code-density instructions. @item em4_fpus Assemble for ARC EM with code-density instructions. @item em4_fpuda Assemble for ARC EM with code-density, and double-precision assist instructions. @item quarkse_em Assemble for QuarkSE-EM cpu. @item archs @cindex @code{mHS} command line option, ARC Assemble for ARC HS. Aliases: @code{-mHS}, @code{-mav2hs}. @item hs Assemble for ARC HS. @item hs34 Assemble for ARC HS34. @item hs38 Assemble for ARC HS38. @item hs38_linux Assemble for ARC HS38 with floating point support on. @item nps400 @cindex @code{mnps400} command line option, ARC Assemble for ARC 700 with NPS-400 extended instructions. @end table Note: the @code{.cpu} directive (@pxref{ARC Directives}) can to be used to select a core variant from within assembly code. @cindex @code{-EB} command line option, ARC @item -EB This option specifies that the output generated by the assembler should be marked as being encoded for a big-endian processor. @cindex @code{-EL} command line option, ARC @item -EL This option specifies that the output generated by the assembler should be marked as being encoded for a little-endian processor - this is the default. @cindex @code{-mcode-density} command line option, ARC @item -mcode-density This option turns on Code Density instructions. Only valid for ARC EM processors. @cindex @code{-mrelax} command line option, ARC @item -mrelax Enable support for assembly-time relaxation. The assembler will replace a longer version of an instruction with a shorter one, whenever it is possible. @cindex @code{-mnps400} command line option, ARC @item -mnps400 Enable support for NPS-400 extended instructions. @cindex @code{-mspfp} command line option, ARC @item -mspfp Enable support for single-precision floating point instructions. @cindex @code{-mdpfp} command line option, ARC @item -mdpfp Enable support for double-precision floating point instructions. @cindex @code{-mfpuda} command line option, ARC @item -mfpuda Enable support for double-precision assist floating point instructions. Only valid for ARC EM processors. @end table @node ARC Syntax @section Syntax @menu * ARC-Chars:: Special Characters * ARC-Regs:: Register Names @end menu @node ARC-Chars @subsection Special Characters @table @code @item % @cindex register name prefix character, ARC @cindex ARC register name prefix character A register name can optionally be prefixed by a @samp{%} character. So register @code{%r0} is equivalent to @code{r0} in the assembly code. @item # @cindex line comment character, ARC @cindex ARC line comment character The presence of a @samp{#} character within a line (but not at the start of a line) indicates the start of a comment that extends to the end of the current line. @emph{Note:} if a line starts with a @samp{#} character then it can also be a logical line number directive (@pxref{Comments}) or a preprocessor control command (@pxref{Preprocessing}). @item @@ @cindex symbol prefix character, ARC @cindex ARC symbol prefix character Prefixing an operand with an @samp{@@} specifies that the operand is a symbol and not a register. This is how the assembler disambiguates the use of an ARC register name as a symbol. So the instruction @example mov r0, @@r0 @end example moves the address of symbol @code{r0} into register @code{r0}. @item ` @cindex line separator, ARC @cindex statement separator, ARC @cindex ARC line separator The @samp{`} (backtick) character is used to separate statements on a single line. @cindex line @item - @cindex C preprocessor macro separator, ARC @cindex ARC C preprocessor macro separator Used as a separator to obtain a sequence of commands from a C preprocessor macro. @end table @node ARC-Regs @subsection Register Names @cindex ARC register names @cindex register names, ARC The ARC assembler uses the following register names for its core registers: @table @code @item r0-r31 @cindex core general registers, ARC @cindex ARC core general registers The core general registers. Registers @code{r26} through @code{r31} have special functions, and are usually referred to by those synonyms. @item gp @cindex global pointer, ARC @cindex ARC global pointer The global pointer and a synonym for @code{r26}. @item fp @cindex frame pointer, ARC @cindex ARC frame pointer The frame pointer and a synonym for @code{r27}. @item sp @cindex stack pointer, ARC @cindex ARC stack pointer The stack pointer and a synonym for @code{r28}. @item ilink1 @cindex level 1 interrupt link register, ARC @cindex ARC level 1 interrupt link register For ARC 600 and ARC 700, the level 1 interrupt link register and a synonym for @code{r29}. Not supported for ARCv2. @item ilink @cindex interrupt link register, ARC @cindex ARC interrupt link register For ARCv2, the interrupt link register and a synonym for @code{r29}. Not supported for ARC 600 and ARC 700. @item ilink2 @cindex level 2 interrupt link register, ARC @cindex ARC level 2 interrupt link register For ARC 600 and ARC 700, the level 2 interrupt link register and a synonym for @code{r30}. Not supported for ARC v2. @item blink @cindex link register, ARC @cindex ARC link register The link register and a synonym for @code{r31}. @item r32-r59 @cindex extension core registers, ARC @cindex ARC extension core registers The extension core registers. @item lp_count @cindex loop counter, ARC @cindex ARC loop counter The loop count register. @item pcl @cindex word aligned program counter, ARC @cindex ARC word aligned program counter The word aligned program counter. @end table In addition the ARC processor has a large number of @emph{auxiliary registers}. The precise set depends on the extensions being supported, but the following baseline set are always defined: @table @code @item identity @cindex Processor Identification register, ARC @cindex ARC Processor Identification register Processor Identification register. Auxiliary register address 0x4. @item pc @cindex Program Counter, ARC @cindex ARC Program Counter Program Counter. Auxiliary register address 0x6. @item status32 @cindex Status register, ARC @cindex ARC Status register Status register. Auxiliary register address 0x0a. @item bta @cindex Branch Target Address, ARC @cindex ARC Branch Target Address Branch Target Address. Auxiliary register address 0x412. @item ecr @cindex Exception Cause Register, ARC @cindex ARC Exception Cause Register Exception Cause Register. Auxiliary register address 0x403. @item int_vector_base @cindex Interrupt Vector Base address, ARC @cindex ARC Interrupt Vector Base address Interrupt Vector Base address. Auxiliary register address 0x25. @item status32_p0 @cindex Stored STATUS32 register on entry to level P0 interrupts, ARC @cindex ARC Stored STATUS32 register on entry to level P0 interrupts Stored STATUS32 register on entry to level P0 interrupts. Auxiliary register address 0xb. @item aux_user_sp @cindex Saved User Stack Pointer, ARC @cindex ARC Saved User Stack Pointer Saved User Stack Pointer. Auxiliary register address 0xd. @item eret @cindex Exception Return Address, ARC @cindex ARC Exception Return Address Exception Return Address. Auxiliary register address 0x400. @item erbta @cindex BTA saved on exception entry, ARC @cindex ARC BTA saved on exception entry BTA saved on exception entry. Auxiliary register address 0x401. @item erstatus @cindex STATUS32 saved on exception, ARC @cindex ARC STATUS32 saved on exception STATUS32 saved on exception. Auxiliary register address 0x402. @item bcr_ver @cindex Build Configuration Registers Version, ARC @cindex ARC Build Configuration Registers Version Build Configuration Registers Version. Auxiliary register address 0x60. @item bta_link_build @cindex Build configuration for: BTA Registers, ARC @cindex ARC Build configuration for: BTA Registers Build configuration for: BTA Registers. Auxiliary register address 0x63. @item vecbase_ac_build @cindex Build configuration for: Interrupts, ARC @cindex ARC Build configuration for: Interrupts Build configuration for: Interrupts. Auxiliary register address 0x68. @item rf_build @cindex Build configuration for: Core Registers, ARC @cindex ARC Build configuration for: Core Registers Build configuration for: Core Registers. Auxiliary register address 0x6e. @item dccm_build @cindex DCCM RAM Configuration Register, ARC @cindex ARC DCCM RAM Configuration Register DCCM RAM Configuration Register. Auxiliary register address 0xc1. @end table Additional auxiliary register names are defined according to the processor architecture version and extensions selected by the options. @node ARC Directives @section ARC Machine Directives @cindex machine directives, ARC @cindex ARC machine directives The ARC version of @code{@value{AS}} supports the following additional machine directives: @table @code @cindex @code{lcomm} directive @item .lcomm @var{symbol}, @var{length}[, @var{alignment}] Reserve @var{length} (an absolute expression) bytes for a local common denoted by @var{symbol}. The section and value of @var{symbol} are those of the new local common. The addresses are allocated in the bss section, so that at run-time the bytes start off zeroed. Since @var{symbol} is not declared global, it is normally not visible to @code{@value{LD}}. The optional third parameter, @var{alignment}, specifies the desired alignment of the symbol in the bss section, specified as a byte boundary (for example, an alignment of 16 means that the least significant 4 bits of the address should be zero). The alignment must be an absolute expression, and it must be a power of two. If no alignment is specified, as will set the alignment to the largest power of two less than or equal to the size of the symbol, up to a maximum of 16. @cindex @code{lcommon} directive, ARC @item .lcommon @var{symbol}, @var{length}[, @var{alignment}] The same as @code{lcomm} directive. @cindex @code{cpu} directive, ARC @item .cpu @var{cpu} The @code{.cpu} directive must be followed by the desired core version. Permitted values for CPU are: @table @code @item ARC600 Assemble for the ARC600 instruction set. @item arc600_norm Assemble for ARC 600 with norm instructions. @item arc600_mul64 Assemble for ARC 600 with mul64 instructions. @item arc600_mul32x16 Assemble for ARC 600 with mul32x16 instructions. @item arc601 Assemble for ARC 601 instruction set. @item arc601_norm Assemble for ARC 601 with norm instructions. @item arc601_mul64 Assemble for ARC 601 with mul64 instructions. @item arc601_mul32x16 Assemble for ARC 601 with mul32x16 instructions. @item ARC700 Assemble for the ARC700 instruction set. @item NPS400 Assemble for the NPS400 instruction set. @item EM Assemble for the ARC EM instruction set. @item arcem Assemble for ARC EM instruction set @item em4 Assemble for ARC EM with code-density instructions. @item em4_dmips Assemble for ARC EM with code-density instructions. @item em4_fpus Assemble for ARC EM with code-density instructions. @item em4_fpuda Assemble for ARC EM with code-density, and double-precision assist instructions. @item quarkse_em Assemble for QuarkSE-EM instruction set. @item HS Assemble for the ARC HS instruction set. @item archs Assemble for ARC HS instruction set. @item hs Assemble for ARC HS instruction set. @item hs34 Assemble for ARC HS34 instruction set. @item hs38 Assemble for ARC HS38 instruction set. @item hs38_linux Assemble for ARC HS38 with floating point support on. @end table Note: the @code{.cpu} directive overrides the command line option @code{-mcpu=@var{cpu}}; a warning is emitted when the version is not consistent between the two. @item .extAuxRegister @var{name}, @var{addr}, @var{mode} @cindex @code{extAuxRegister} directive, ARC Auxiliary registers can be defined in the assembler source code by using this directive. The first parameter, @var{name}, is the name of the new auxiliary register. The second parameter, @var{addr}, is address the of the auxiliary register. The third parameter, @var{mode}, specifies whether the register is readable and/or writable and is one of: @table @code @item r Read only; @item w Write only; @item r|w Read and write. @end table For example: @example .extAuxRegister mulhi, 0x12, w @end example specifies a write only extension auxiliary register, @var{mulhi} at address 0x12. @item .extCondCode @var{suffix}, @var{val} @cindex @code{extCondCode} directive, ARC ARC supports extensible condition codes. This directive defines a new condition code, to be known by the suffix, @var{suffix} and will depend on the value, @var{val} in the condition code. For example: @example .extCondCode is_busy,0x14 add.is_busy r1,r2,r3 @end example will only execute the @code{add} instruction if the condition code value is 0x14. @item .extCoreRegister @var{name}, @var{regnum}, @var{mode}, @var{shortcut} @cindex @code{extCoreRegister} directive, ARC Specifies an extension core register named @var{name} as a synonym for the register numbered @var{regnum}. The register number must be between 32 and 59. The third argument, @var{mode}, indicates whether the register is readable and/or writable and is one of: @table @code @item r Read only; @item w Write only; @item r|w Read and write. @end table The final parameter, @var{shortcut} indicates whether the register has a short cut in the pipeline. The valid values are: @table @code @item can_shortcut The register has a short cut in the pipeline; @item cannot_shortcut The register does not have a short cut in the pipeline. @end table For example: @example .extCoreRegister mlo, 57, r , can_shortcut @end example defines a read only extension core register, @code{mlo}, which is register 57, and can short cut the pipeline. @item .extInstruction @var{name}, @var{opcode}, @var{subopcode}, @var{suffixclass}, @var{syntaxclass} @cindex @code{extInstruction} directive, ARC ARC allows the user to specify extension instructions. These extension instructions are not macros; the assembler creates encodings for use of these instructions according to the specification by the user. The first argument, @var{name}, gives the name of the instruction. The second argument, @var{opcode}, is the opcode to be used (bits 31:27 in the encoding). The third argument, @var{subopcode}, is the sub-opcode to be used, but the correct value also depends on the fifth argument, @var{syntaxclass} The fourth argument, @var{suffixclass}, determines the kinds of suffixes to be allowed. Valid values are: @table @code @item SUFFIX_NONE No suffixes are permitted; @item SUFFIX_COND Conditional suffixes are permitted; @item SUFFIX_FLAG Flag setting suffixes are permitted. @item SUFFIX_COND|SUFFIX_FLAG Both conditional and flag setting suffices are permitted. @end table The fifth and final argument, @var{syntaxclass}, determines the syntax class for the instruction. It can have the following values: @table @code @item SYNTAX_2OP Two Operand Instruction; @item SYNTAX_3OP Three Operand Instruction. @item SYNTAX_1OP One Operand Instruction. @item SYNTAX_NOP No Operand Instruction. @end table The syntax class may be followed by @samp{|} and one of the following modifiers. @table @code @item OP1_MUST_BE_IMM Modifies syntax class @code{SYNTAX_3OP}, specifying that the first operand of a three-operand instruction must be an immediate (i.e., the result is discarded). This is usually used to set the flags using specific instructions and not retain results. @item OP1_IMM_IMPLIED Modifies syntax class @code{SYNTAX_20P}, specifying that there is an implied immediate destination operand which does not appear in the syntax. For example, if the source code contains an instruction like: @example inst r1,r2 @end example the first argument is an implied immediate (that is, the result is discarded). This is the same as though the source code were: inst 0,r1,r2. @end table For example, defining a 64-bit multiplier with immediate operands: @example .extInstruction mp64, 0x07, 0x2d, SUFFIX_COND|SUFFIX_FLAG, SYNTAX_3OP|OP1_MUST_BE_IMM @end example which specifies an extension instruction named @code{mp64} with 3 operands. It sets the flags and can be used with a condition code, for which the first operand is an immediate, i.e. equivalent to discarding the result of the operation. A two operands instruction variant would be: @example .extInstruction mul64, 0x07, 0x2d, SUFFIX_COND, SYNTAX_2OP|OP1_IMM_IMPLIED @end example which describes a two operand instruction with an implicit first immediate operand. The result of this operation would be discarded. @cindex @code{.arc_attribute} directive, ARC @item .arc_attribute @var{tag}, @var{value} Set the ARC object attribute @var{tag} to @var{value}. The @var{tag} is either an attribute number, or one of the following: @code{Tag_ARC_PCS_config}, @code{Tag_ARC_CPU_base}, @code{Tag_ARC_CPU_variation}, @code{Tag_ARC_CPU_name}, @code{Tag_ARC_ABI_rf16}, @code{Tag_ARC_ABI_osver}, @code{Tag_ARC_ABI_sda}, @code{Tag_ARC_ABI_pic}, @code{Tag_ARC_ABI_tls}, @code{Tag_ARC_ABI_enumsize}, @code{Tag_ARC_ABI_exceptions}, @code{Tag_ARC_ABI_double_size}, @code{Tag_ARC_ISA_config}, @code{Tag_ARC_ISA_apex}, @code{Tag_ARC_ISA_mpy_option} The @var{value} is either a @code{number}, @code{"string"}, or @code{number, "string"} depending on the tag. @end table @node ARC Modifiers @section ARC Assembler Modifiers The following additional assembler modifiers have been added for position-independent code. These modifiers are available only with the ARC 700 and above processors and generate relocation entries, which are interpreted by the linker as follows: @table @code @item @@pcl(@var{symbol}) @cindex @@pcl(@var{symbol}), ARC modifier Relative distance of @var{symbol}'s from the current program counter location. @item @@gotpc(@var{symbol}) @cindex @@gotpc(@var{symbol}), ARC modifier Relative distance of @var{symbol}'s Global Offset Table entry from the current program counter location. @item @@gotoff(@var{symbol}) @cindex @@gotoff(@var{symbol}), ARC modifier Distance of @var{symbol} from the base of the Global Offset Table. @item @@plt(@var{symbol}) @cindex @@plt(@var{symbol}), ARC modifier Distance of @var{symbol}'s Procedure Linkage Table entry from the current program counter. This is valid only with branch and link instructions and PC-relative calls. @item @@sda(@var{symbol}) @cindex @@sda(@var{symbol}), ARC modifier Relative distance of @var{symbol} from the base of the Small Data Pointer. @end table @node ARC Symbols @section ARC Pre-defined Symbols The following assembler symbols will prove useful when developing position-independent code. These symbols are available only with the ARC 700 and above processors. @table @code @item __GLOBAL_OFFSET_TABLE__ @cindex __GLOBAL_OFFSET_TABLE__, ARC pre-defined symbol Symbol referring to the base of the Global Offset Table. @item __DYNAMIC__ @cindex __DYNAMIC__, ARC pre-defined symbol An alias for the Global Offset Table @code{Base__GLOBAL_OFFSET_TABLE__}. It can be used only with @code{@@gotpc} modifiers. @end table @node ARC Opcodes @section Opcodes @cindex ARC opcodes @cindex opcodes for ARC For information on the ARC instruction set, see @cite{ARC Programmers Reference Manual}, available where you download the processor IP library.