| @c Copyright (C) 1991-2016 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 i960-Dependent |
| @chapter Intel 80960 Dependent Features |
| @end ifset |
| @ifclear GENERIC |
| @node Machine Dependencies |
| @chapter Intel 80960 Dependent Features |
| @end ifclear |
| |
| @cindex i960 support |
| @menu |
| * Options-i960:: i960 Command-line Options |
| * Floating Point-i960:: Floating Point |
| * Directives-i960:: i960 Machine Directives |
| * Opcodes for i960:: i960 Opcodes |
| * Syntax of i960:: i960 Syntax |
| @end menu |
| |
| @c FIXME! Add Syntax sec with discussion of bitfields here, at least so |
| @c long as they're not turned on for other machines than 960. |
| |
| @node Options-i960 |
| |
| @section i960 Command-line Options |
| |
| @cindex i960 options |
| @cindex options, i960 |
| @table @code |
| |
| @cindex i960 architecture options |
| @cindex architecture options, i960 |
| @cindex @code{-A} options, i960 |
| @item -ACA | -ACA_A | -ACB | -ACC | -AKA | -AKB | -AKC | -AMC |
| Select the 80960 architecture. Instructions or features not supported |
| by the selected architecture cause fatal errors. |
| |
| @samp{-ACA} is equivalent to @samp{-ACA_A}; @samp{-AKC} is equivalent to |
| @samp{-AMC}. Synonyms are provided for compatibility with other tools. |
| |
| If you do not specify any of these options, @code{@value{AS}} generates code |
| for any instruction or feature that is supported by @emph{some} version of the |
| 960 (even if this means mixing architectures!). In principle, |
| @code{@value{AS}} attempts to deduce the minimal sufficient processor type if |
| none is specified; depending on the object code format, the processor type may |
| be recorded in the object file. If it is critical that the @code{@value{AS}} |
| output match a specific architecture, specify that architecture explicitly. |
| |
| @cindex @code{-b} option, i960 |
| @cindex branch recording, i960 |
| @cindex i960 branch recording |
| @item -b |
| Add code to collect information about conditional branches taken, for |
| later optimization using branch prediction bits. (The conditional branch |
| instructions have branch prediction bits in the CA, CB, and CC |
| architectures.) If @var{BR} represents a conditional branch instruction, |
| the following represents the code generated by the assembler when |
| @samp{-b} is specified: |
| |
| @smallexample |
| call @var{increment routine} |
| .word 0 # pre-counter |
| Label: @var{BR} |
| call @var{increment routine} |
| .word 0 # post-counter |
| @end smallexample |
| |
| The counter following a branch records the number of times that branch |
| was @emph{not} taken; the difference between the two counters is the |
| number of times the branch @emph{was} taken. |
| |
| @cindex @code{gbr960}, i960 postprocessor |
| @cindex branch statistics table, i960 |
| A table of every such @code{Label} is also generated, so that the |
| external postprocessor @code{gbr960} (supplied by Intel) can locate all |
| the counters. This table is always labeled @samp{__BRANCH_TABLE__}; |
| this is a local symbol to permit collecting statistics for many separate |
| object files. The table is word aligned, and begins with a two-word |
| header. The first word, initialized to 0, is used in maintaining linked |
| lists of branch tables. The second word is a count of the number of |
| entries in the table, which follow immediately: each is a word, pointing |
| to one of the labels illustrated above. |
| |
| @c TEXI2ROFF-KILL |
| @ifinfo |
| @c END TEXI2ROFF-KILL |
| @example |
| +------------+------------+------------+ ... +------------+ |
| | | | | | | |
| | *NEXT | COUNT: N | *BRLAB 1 | | *BRLAB N | |
| | | | | | | |
| +------------+------------+------------+ ... +------------+ |
| |
| __BRANCH_TABLE__ layout |
| @end example |
| @c TEXI2ROFF-KILL |
| @end ifinfo |
| @need 2000 |
| @tex |
| \vskip 1pc |
| \line{\leftskip=0pt\hskip\tableindent |
| \boxit{2cm}{\tt *NEXT}\boxit{2cm}{\tt COUNT: \it N}\boxit{2cm}{\tt |
| *BRLAB 1}\ibox{1cm}{\quad\dots}\boxit{2cm}{\tt *BRLAB \it N}\hfil} |
| \centerline{\it {\tt \_\_BRANCH\_TABLE\_\_} layout} |
| @end tex |
| @c END TEXI2ROFF-KILL |
| |
| The first word of the header is used to locate multiple branch tables, |
| since each object file may contain one. Normally the links are |
| maintained with a call to an initialization routine, placed at the |
| beginning of each function in the file. The @sc{gnu} C compiler |
| generates these calls automatically when you give it a @samp{-b} option. |
| For further details, see the documentation of @samp{gbr960}. |
| |
| @cindex @code{-no-relax} option, i960 |
| @item -no-relax |
| Normally, Compare-and-Branch instructions with targets that require |
| displacements greater than 13 bits (or that have external targets) are |
| replaced with the corresponding compare (or @samp{chkbit}) and branch |
| instructions. You can use the @samp{-no-relax} option to specify that |
| @code{@value{AS}} should generate errors instead, if the target displacement |
| is larger than 13 bits. |
| |
| This option does not affect the Compare-and-Jump instructions; the code |
| emitted for them is @emph{always} adjusted when necessary (depending on |
| displacement size), regardless of whether you use @samp{-no-relax}. |
| @end table |
| |
| @node Floating Point-i960 |
| @section Floating Point |
| |
| @cindex floating point, i960 (@sc{ieee}) |
| @cindex i960 floating point (@sc{ieee}) |
| @code{@value{AS}} generates @sc{ieee} floating-point numbers for the directives |
| @samp{.float}, @samp{.double}, @samp{.extended}, and @samp{.single}. |
| |
| @node Directives-i960 |
| @section i960 Machine Directives |
| |
| @cindex machine directives, i960 |
| @cindex i960 machine directives |
| |
| @table @code |
| @cindex @code{bss} directive, i960 |
| @item .bss @var{symbol}, @var{length}, @var{align} |
| Reserve @var{length} bytes in the bss section for a local @var{symbol}, |
| aligned to the power of two specified by @var{align}. @var{length} and |
| @var{align} must be positive absolute expressions. This directive |
| differs from @samp{.lcomm} only in that it permits you to specify |
| an alignment. @xref{Lcomm,,@code{.lcomm}}. |
| @end table |
| |
| @table @code |
| @cindex @code{extended} directive, i960 |
| @item .extended @var{flonums} |
| @code{.extended} expects zero or more flonums, separated by commas; for |
| each flonum, @samp{.extended} emits an @sc{ieee} extended-format (80-bit) |
| floating-point number. |
| |
| @cindex @code{leafproc} directive, i960 |
| @item .leafproc @var{call-lab}, @var{bal-lab} |
| You can use the @samp{.leafproc} directive in conjunction with the |
| optimized @code{callj} instruction to enable faster calls of leaf |
| procedures. If a procedure is known to call no other procedures, you |
| may define an entry point that skips procedure prolog code (and that does |
| not depend on system-supplied saved context), and declare it as the |
| @var{bal-lab} using @samp{.leafproc}. If the procedure also has an |
| entry point that goes through the normal prolog, you can specify that |
| entry point as @var{call-lab}. |
| |
| A @samp{.leafproc} declaration is meant for use in conjunction with the |
| optimized call instruction @samp{callj}; the directive records the data |
| needed later to choose between converting the @samp{callj} into a |
| @code{bal} or a @code{call}. |
| |
| @var{call-lab} is optional; if only one argument is present, or if the |
| two arguments are identical, the single argument is assumed to be the |
| @code{bal} entry point. |
| |
| @cindex @code{sysproc} directive, i960 |
| @item .sysproc @var{name}, @var{index} |
| The @samp{.sysproc} directive defines a name for a system procedure. |
| After you define it using @samp{.sysproc}, you can use @var{name} to |
| refer to the system procedure identified by @var{index} when calling |
| procedures with the optimized call instruction @samp{callj}. |
| |
| Both arguments are required; @var{index} must be between 0 and 31 |
| (inclusive). |
| @end table |
| |
| @node Opcodes for i960 |
| @section i960 Opcodes |
| |
| @cindex opcodes, i960 |
| @cindex i960 opcodes |
| All Intel 960 machine instructions are supported; |
| @pxref{Options-i960,,i960 Command-line Options} for a discussion of |
| selecting the instruction subset for a particular 960 |
| architecture.@refill |
| |
| Some opcodes are processed beyond simply emitting a single corresponding |
| instruction: @samp{callj}, and Compare-and-Branch or Compare-and-Jump |
| instructions with target displacements larger than 13 bits. |
| |
| @menu |
| * callj-i960:: @code{callj} |
| * Compare-and-branch-i960:: Compare-and-Branch |
| @end menu |
| |
| @node callj-i960 |
| @subsection @code{callj} |
| |
| @cindex @code{callj}, i960 pseudo-opcode |
| @cindex i960 @code{callj} pseudo-opcode |
| You can write @code{callj} to have the assembler or the linker determine |
| the most appropriate form of subroutine call: @samp{call}, |
| @samp{bal}, or @samp{calls}. If the assembly source contains |
| enough information---a @samp{.leafproc} or @samp{.sysproc} directive |
| defining the operand---then @code{@value{AS}} translates the |
| @code{callj}; if not, it simply emits the @code{callj}, leaving it |
| for the linker to resolve. |
| |
| @node Compare-and-branch-i960 |
| @subsection Compare-and-Branch |
| |
| @cindex i960 compare/branch instructions |
| @cindex compare/branch instructions, i960 |
| The 960 architectures provide combined Compare-and-Branch instructions |
| that permit you to store the branch target in the lower 13 bits of the |
| instruction word itself. However, if you specify a branch target far |
| enough away that its address won't fit in 13 bits, the assembler can |
| either issue an error, or convert your Compare-and-Branch instruction |
| into separate instructions to do the compare and the branch. |
| |
| @cindex compare and jump expansions, i960 |
| @cindex i960 compare and jump expansions |
| Whether @code{@value{AS}} gives an error or expands the instruction depends |
| on two choices you can make: whether you use the @samp{-no-relax} option, |
| and whether you use a ``Compare and Branch'' instruction or a ``Compare |
| and Jump'' instruction. The ``Jump'' instructions are @emph{always} |
| expanded if necessary; the ``Branch'' instructions are expanded when |
| necessary @emph{unless} you specify @code{-no-relax}---in which case |
| @code{@value{AS}} gives an error instead. |
| |
| These are the Compare-and-Branch instructions, their ``Jump'' variants, |
| and the instruction pairs they may expand into: |
| |
| @c TEXI2ROFF-KILL |
| @ifinfo |
| @c END TEXI2ROFF-KILL |
| @example |
| Compare and |
| Branch Jump Expanded to |
| ------ ------ ------------ |
| bbc chkbit; bno |
| bbs chkbit; bo |
| cmpibe cmpije cmpi; be |
| cmpibg cmpijg cmpi; bg |
| cmpibge cmpijge cmpi; bge |
| cmpibl cmpijl cmpi; bl |
| cmpible cmpijle cmpi; ble |
| cmpibno cmpijno cmpi; bno |
| cmpibne cmpijne cmpi; bne |
| cmpibo cmpijo cmpi; bo |
| cmpobe cmpoje cmpo; be |
| cmpobg cmpojg cmpo; bg |
| cmpobge cmpojge cmpo; bge |
| cmpobl cmpojl cmpo; bl |
| cmpoble cmpojle cmpo; ble |
| cmpobne cmpojne cmpo; bne |
| @end example |
| @c TEXI2ROFF-KILL |
| @end ifinfo |
| @tex |
| \hskip\tableindent |
| \halign{\hfil {\tt #}\quad&\hfil {\tt #}\qquad&{\tt #}\hfil\cr |
| \omit{\hfil\it Compare and\hfil}\span\omit&\cr |
| {\it Branch}&{\it Jump}&{\it Expanded to}\cr |
| bbc& & chkbit; bno\cr |
| bbs& & chkbit; bo\cr |
| cmpibe& cmpije& cmpi; be\cr |
| cmpibg& cmpijg& cmpi; bg\cr |
| cmpibge& cmpijge& cmpi; bge\cr |
| cmpibl& cmpijl& cmpi; bl\cr |
| cmpible& cmpijle& cmpi; ble\cr |
| cmpibno& cmpijno& cmpi; bno\cr |
| cmpibne& cmpijne& cmpi; bne\cr |
| cmpibo& cmpijo& cmpi; bo\cr |
| cmpobe& cmpoje& cmpo; be\cr |
| cmpobg& cmpojg& cmpo; bg\cr |
| cmpobge& cmpojge& cmpo; bge\cr |
| cmpobl& cmpojl& cmpo; bl\cr |
| cmpoble& cmpojle& cmpo; ble\cr |
| cmpobne& cmpojne& cmpo; bne\cr} |
| @end tex |
| @c END TEXI2ROFF-KILL |
| |
| @node Syntax of i960 |
| @section Syntax for the i960 |
| @menu |
| * i960-Chars:: Special Characters |
| @end menu |
| |
| @node i960-Chars |
| @subsection Special Characters |
| |
| @cindex line comment character, i960 |
| @cindex i960 line comment character |
| The presence of a @samp{#} on a line indicates the start of a comment |
| that extends to the end of the current line. |
| |
| If a @samp{#} appears as the first character of a line, the whole line |
| is treated as a comment, but in this case the line can also be a |
| logical line number directive (@pxref{Comments}) or a |
| preprocessor control command (@pxref{Preprocessing}). |
| |
| @cindex line separator, i960 |
| @cindex statement separator, i960 |
| @cindex i960 line separator |
| The @samp{;} character can be used to separate statements on the same |
| line. |