| @c Copyright (C) 1997-2021 Free Software Foundation, Inc. |
| @c This is part of the GAS manual. |
| @c For copying conditions, see the file as.texinfo. |
| |
| @node V850-Dependent |
| @chapter v850 Dependent Features |
| |
| @cindex V850 support |
| @menu |
| * V850 Options:: Options |
| * V850 Syntax:: Syntax |
| * V850 Floating Point:: Floating Point |
| * V850 Directives:: V850 Machine Directives |
| * V850 Opcodes:: Opcodes |
| @end menu |
| |
| @node V850 Options |
| @section Options |
| @cindex V850 options (none) |
| @cindex options for V850 (none) |
| @code{@value{AS}} supports the following additional command-line options |
| for the V850 processor family: |
| |
| @cindex command-line options, V850 |
| @cindex V850 command-line options |
| @table @code |
| |
| @cindex @code{-wsigned_overflow} command-line option, V850 |
| @item -wsigned_overflow |
| Causes warnings to be produced when signed immediate values overflow the |
| space available for then within their opcodes. By default this option |
| is disabled as it is possible to receive spurious warnings due to using |
| exact bit patterns as immediate constants. |
| |
| @cindex @code{-wunsigned_overflow} command-line option, V850 |
| @item -wunsigned_overflow |
| Causes warnings to be produced when unsigned immediate values overflow |
| the space available for then within their opcodes. By default this |
| option is disabled as it is possible to receive spurious warnings due to |
| using exact bit patterns as immediate constants. |
| |
| @cindex @code{-mv850} command-line option, V850 |
| @item -mv850 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{-mv850e} command-line option, V850 |
| @item -mv850e |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{-mv850e1} command-line option, V850 |
| @item -mv850e1 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E1 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{-mv850any} command-line option, V850 |
| @item -mv850any |
| Specifies that the assembled code should be marked as being targeted at |
| the V850 processor but support instructions that are specific to the |
| extended variants of the process. This allows the production of |
| binaries that contain target specific code, but which are also intended |
| to be used in a generic fashion. For example libgcc.a contains generic |
| routines used by the code produced by GCC for all versions of the v850 |
| architecture, together with support routines only used by the V850E |
| architecture. |
| |
| @cindex @code{-mv850e2} command-line option, V850 |
| @item -mv850e2 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E2 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{-mv850e2v3} command-line option, V850 |
| @item -mv850e2v3 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E2V3 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{-mv850e2v4} command-line option, V850 |
| @item -mv850e2v4 |
| This is an alias for @option{-mv850e3v5}. |
| |
| @cindex @code{-mv850e3v5} command-line option, V850 |
| @item -mv850e3v5 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E3V5 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{-mrelax} command-line option, V850 |
| @item -mrelax |
| Enables relaxation. This allows the .longcall and .longjump pseudo |
| ops to be used in the assembler source code. These ops label sections |
| of code which are either a long function call or a long branch. The |
| assembler will then flag these sections of code and the linker will |
| attempt to relax them. |
| |
| @cindex @code{-mgcc-abi} command-line option, V850 |
| @item -mgcc-abi |
| Marks the generated object file as supporting the old GCC ABI. |
| |
| @cindex @code{-mrh850-abi} command-line option, V850 |
| @item -mrh850-abi |
| Marks the generated object file as supporting the RH850 ABI. This is |
| the default. |
| |
| @cindex @code{-m8byte-align} command-line option, V850 |
| @item -m8byte-align |
| Marks the generated object file as supporting a maximum 64-bits of |
| alignment for variables defined in the source code. |
| |
| @cindex @code{-m4byte-align} command-line option, V850 |
| @item -m4byte-align |
| Marks the generated object file as supporting a maximum 32-bits of |
| alignment for variables defined in the source code. This is the |
| default. |
| |
| @cindex @code{-msoft-float} command-line option, V850 |
| @item -msoft-float |
| Marks the generated object file as not using any floating point |
| instructions - and hence can be linked with other V850 binaries |
| that do or do not use floating point. This is the default for |
| binaries for architectures earlier than the @code{e2v3}. |
| |
| @cindex @code{-mhard-float} command-line option, V850 |
| @item -mhard-float |
| Marks the generated object file as one that uses floating point |
| instructions - and hence can only be linked with other V850 binaries |
| that use the same kind of floating point instructions, or with |
| binaries that do not use floating point at all. This is the default |
| for binaries the @code{e2v3} and later architectures. |
| |
| @end table |
| |
| @node V850 Syntax |
| @section Syntax |
| @menu |
| * V850-Chars:: Special Characters |
| * V850-Regs:: Register Names |
| @end menu |
| |
| @node V850-Chars |
| @subsection Special Characters |
| |
| @cindex line comment character, V850 |
| @cindex V850 line comment character |
| @samp{#} is the line comment character. 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}). |
| |
| Two dashes (@samp{--}) can also be used to start a line comment. |
| |
| @cindex line separator, V850 |
| @cindex statement separator, V850 |
| @cindex V850 line separator |
| |
| The @samp{;} character can be used to separate statements on the same |
| line. |
| |
| @node V850-Regs |
| @subsection Register Names |
| |
| @cindex V850 register names |
| @cindex register names, V850 |
| @code{@value{AS}} supports the following names for registers: |
| @table @code |
| @cindex @code{zero} register, V850 |
| @item general register 0 |
| r0, zero |
| @item general register 1 |
| r1 |
| @item general register 2 |
| r2, hp |
| @cindex @code{sp} register, V850 |
| @item general register 3 |
| r3, sp |
| @cindex @code{gp} register, V850 |
| @item general register 4 |
| r4, gp |
| @cindex @code{tp} register, V850 |
| @item general register 5 |
| r5, tp |
| @item general register 6 |
| r6 |
| @item general register 7 |
| r7 |
| @item general register 8 |
| r8 |
| @item general register 9 |
| r9 |
| @item general register 10 |
| r10 |
| @item general register 11 |
| r11 |
| @item general register 12 |
| r12 |
| @item general register 13 |
| r13 |
| @item general register 14 |
| r14 |
| @item general register 15 |
| r15 |
| @item general register 16 |
| r16 |
| @item general register 17 |
| r17 |
| @item general register 18 |
| r18 |
| @item general register 19 |
| r19 |
| @item general register 20 |
| r20 |
| @item general register 21 |
| r21 |
| @item general register 22 |
| r22 |
| @item general register 23 |
| r23 |
| @item general register 24 |
| r24 |
| @item general register 25 |
| r25 |
| @item general register 26 |
| r26 |
| @item general register 27 |
| r27 |
| @item general register 28 |
| r28 |
| @item general register 29 |
| r29 |
| @cindex @code{ep} register, V850 |
| @item general register 30 |
| r30, ep |
| @cindex @code{lp} register, V850 |
| @item general register 31 |
| r31, lp |
| @cindex @code{eipc} register, V850 |
| @item system register 0 |
| eipc |
| @cindex @code{eipsw} register, V850 |
| @item system register 1 |
| eipsw |
| @cindex @code{fepc} register, V850 |
| @item system register 2 |
| fepc |
| @cindex @code{fepsw} register, V850 |
| @item system register 3 |
| fepsw |
| @cindex @code{ecr} register, V850 |
| @item system register 4 |
| ecr |
| @cindex @code{psw} register, V850 |
| @item system register 5 |
| psw |
| @cindex @code{ctpc} register, V850 |
| @item system register 16 |
| ctpc |
| @cindex @code{ctpsw} register, V850 |
| @item system register 17 |
| ctpsw |
| @cindex @code{dbpc} register, V850 |
| @item system register 18 |
| dbpc |
| @cindex @code{dbpsw} register, V850 |
| @item system register 19 |
| dbpsw |
| @cindex @code{ctbp} register, V850 |
| @item system register 20 |
| ctbp |
| @end table |
| |
| @node V850 Floating Point |
| @section Floating Point |
| |
| @cindex floating point, V850 (@sc{ieee}) |
| @cindex V850 floating point (@sc{ieee}) |
| The V850 family uses @sc{ieee} floating-point numbers. |
| |
| @node V850 Directives |
| @section V850 Machine Directives |
| |
| @cindex machine directives, V850 |
| @cindex V850 machine directives |
| @table @code |
| @cindex @code{offset} directive, V850 |
| @item .offset @var{<expression>} |
| Moves the offset into the current section to the specified amount. |
| |
| @cindex @code{section} directive, V850 |
| @item .section "name", <type> |
| This is an extension to the standard .section directive. It sets the |
| current section to be <type> and creates an alias for this section |
| called "name". |
| |
| @cindex @code{.v850} directive, V850 |
| @item .v850 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{.v850e} directive, V850 |
| @item .v850e |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{.v850e1} directive, V850 |
| @item .v850e1 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E1 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{.v850e2} directive, V850 |
| @item .v850e2 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E2 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{.v850e2v3} directive, V850 |
| @item .v850e2v3 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E2V3 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{.v850e2v4} directive, V850 |
| @item .v850e2v4 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E3V5 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @cindex @code{.v850e3v5} directive, V850 |
| @item .v850e3v5 |
| Specifies that the assembled code should be marked as being targeted at |
| the V850E3V5 processor. This allows the linker to detect attempts to link |
| such code with code assembled for other processors. |
| |
| @end table |
| |
| @node V850 Opcodes |
| @section Opcodes |
| |
| @cindex V850 opcodes |
| @cindex opcodes for V850 |
| @code{@value{AS}} implements all the standard V850 opcodes. |
| |
| @code{@value{AS}} also implements the following pseudo ops: |
| |
| @table @code |
| |
| @cindex @code{hi0} pseudo-op, V850 |
| @item hi0() |
| Computes the higher 16 bits of the given expression and stores it into |
| the immediate operand field of the given instruction. For example: |
| |
| @samp{mulhi hi0(here - there), r5, r6} |
| |
| computes the difference between the address of labels 'here' and |
| 'there', takes the upper 16 bits of this difference, shifts it down 16 |
| bits and then multiplies it by the lower 16 bits in register 5, putting |
| the result into register 6. |
| |
| @cindex @code{lo} pseudo-op, V850 |
| @item lo() |
| Computes the lower 16 bits of the given expression and stores it into |
| the immediate operand field of the given instruction. For example: |
| |
| @samp{addi lo(here - there), r5, r6} |
| |
| computes the difference between the address of labels 'here' and |
| 'there', takes the lower 16 bits of this difference and adds it to |
| register 5, putting the result into register 6. |
| |
| @cindex @code{hi} pseudo-op, V850 |
| @item hi() |
| Computes the higher 16 bits of the given expression and then adds the |
| value of the most significant bit of the lower 16 bits of the expression |
| and stores the result into the immediate operand field of the given |
| instruction. For example the following code can be used to compute the |
| address of the label 'here' and store it into register 6: |
| |
| @samp{movhi hi(here), r0, r6} |
| @samp{movea lo(here), r6, r6} |
| |
| The reason for this special behaviour is that movea performs a sign |
| extension on its immediate operand. So for example if the address of |
| 'here' was 0xFFFFFFFF then without the special behaviour of the hi() |
| pseudo-op the movhi instruction would put 0xFFFF0000 into r6, then the |
| movea instruction would takes its immediate operand, 0xFFFF, sign extend |
| it to 32 bits, 0xFFFFFFFF, and then add it into r6 giving 0xFFFEFFFF |
| which is wrong (the fifth nibble is E). With the hi() pseudo op adding |
| in the top bit of the lo() pseudo op, the movhi instruction actually |
| stores 0 into r6 (0xFFFF + 1 = 0x0000), so that the movea instruction |
| stores 0xFFFFFFFF into r6 - the right value. |
| |
| @cindex @code{hilo} pseudo-op, V850 |
| @item hilo() |
| Computes the 32 bit value of the given expression and stores it into |
| the immediate operand field of the given instruction (which must be a |
| mov instruction). For example: |
| |
| @samp{mov hilo(here), r6} |
| |
| computes the absolute address of label 'here' and puts the result into |
| register 6. |
| |
| @cindex @code{sdaoff} pseudo-op, V850 |
| @item sdaoff() |
| Computes the offset of the named variable from the start of the Small |
| Data Area (whose address is held in register 4, the GP register) and |
| stores the result as a 16 bit signed value in the immediate operand |
| field of the given instruction. For example: |
| |
| @samp{ld.w sdaoff(_a_variable)[gp],r6} |
| |
| loads the contents of the location pointed to by the label '_a_variable' |
| into register 6, provided that the label is located somewhere within +/- |
| 32K of the address held in the GP register. [Note the linker assumes |
| that the GP register contains a fixed address set to the address of the |
| label called '__gp'. This can either be set up automatically by the |
| linker, or specifically set by using the @samp{--defsym __gp=<value>} |
| command-line option]. |
| |
| @cindex @code{tdaoff} pseudo-op, V850 |
| @item tdaoff() |
| Computes the offset of the named variable from the start of the Tiny |
| Data Area (whose address is held in register 30, the EP register) and |
| stores the result as a 4,5, 7 or 8 bit unsigned value in the immediate |
| operand field of the given instruction. For example: |
| |
| @samp{sld.w tdaoff(_a_variable)[ep],r6} |
| |
| loads the contents of the location pointed to by the label '_a_variable' |
| into register 6, provided that the label is located somewhere within +256 |
| bytes of the address held in the EP register. [Note the linker assumes |
| that the EP register contains a fixed address set to the address of the |
| label called '__ep'. This can either be set up automatically by the |
| linker, or specifically set by using the @samp{--defsym __ep=<value>} |
| command-line option]. |
| |
| @cindex @code{zdaoff} pseudo-op, V850 |
| @item zdaoff() |
| Computes the offset of the named variable from address 0 and stores the |
| result as a 16 bit signed value in the immediate operand field of the |
| given instruction. For example: |
| |
| @samp{movea zdaoff(_a_variable),zero,r6} |
| |
| puts the address of the label '_a_variable' into register 6, assuming |
| that the label is somewhere within the first 32K of memory. (Strictly |
| speaking it also possible to access the last 32K of memory as well, as |
| the offsets are signed). |
| |
| @cindex @code{ctoff} pseudo-op, V850 |
| @item ctoff() |
| Computes the offset of the named variable from the start of the Call |
| Table Area (whose address is held in system register 20, the CTBP |
| register) and stores the result a 6 or 16 bit unsigned value in the |
| immediate field of then given instruction or piece of data. For |
| example: |
| |
| @samp{callt ctoff(table_func1)} |
| |
| will put the call the function whose address is held in the call table |
| at the location labeled 'table_func1'. |
| |
| @cindex @code{longcall} pseudo-op, V850 |
| @item .longcall @code{name} |
| Indicates that the following sequence of instructions is a long call |
| to function @code{name}. The linker will attempt to shorten this call |
| sequence if @code{name} is within a 22bit offset of the call. Only |
| valid if the @code{-mrelax} command-line switch has been enabled. |
| |
| @cindex @code{longjump} pseudo-op, V850 |
| @item .longjump @code{name} |
| Indicates that the following sequence of instructions is a long jump |
| to label @code{name}. The linker will attempt to shorten this code |
| sequence if @code{name} is within a 22bit offset of the jump. Only |
| valid if the @code{-mrelax} command-line switch has been enabled. |
| |
| @end table |
| |
| |
| For information on the V850 instruction set, see @cite{V850 |
| Family 32-/16-Bit single-Chip Microcontroller Architecture Manual} from NEC. |
| Ltd. |