You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
5.6 KiB
HTML

<html lang="en">
<head>
<title>Local Reg Vars - Using the GNU Compiler Collection (GCC)</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Using the GNU Compiler Collection (GCC)">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Explicit-Reg-Vars.html#Explicit-Reg-Vars" title="Explicit Reg Vars">
<link rel="prev" href="Global-Reg-Vars.html#Global-Reg-Vars" title="Global Reg Vars">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988-2015 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Funding Free Software'', the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
``GNU Free Documentation License''.
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development.-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
</head>
<body>
<div class="node">
<a name="Local-Reg-Vars"></a>
<p>
Previous:&nbsp;<a rel="previous" accesskey="p" href="Global-Reg-Vars.html#Global-Reg-Vars">Global Reg Vars</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Explicit-Reg-Vars.html#Explicit-Reg-Vars">Explicit Reg Vars</a>
<hr>
</div>
<h5 class="subsubsection">6.43.5.2 Specifying Registers for Local Variables</h5>
<p><a name="index-local-variables_002c-specifying-registers-3504"></a><a name="index-specifying-registers-for-local-variables-3505"></a><a name="index-registers-for-local-variables-3506"></a>
You can define a local register variable with a specified register
like this:
<pre class="smallexample"> register int *foo asm ("a5");
</pre>
<p class="noindent">Here <code>a5</code> is the name of the register that should be used. Note
that this is the same syntax used for defining global register
variables, but for a local variable it appears within a function.
<p>Naturally the register name is CPU-dependent, but this is not a
problem, since specific registers are most often useful with explicit
assembler instructions (see <a href="Extended-Asm.html#Extended-Asm">Extended Asm</a>). Both of these things
generally require that you conditionalize your program according to
CPU type.
<p>In addition, operating systems on one type of CPU may differ in how they
name the registers; then you need additional conditionals. For
example, some 68000 operating systems call this register <code>%a5</code>.
<p>Defining such a register variable does not reserve the register; it
remains available for other uses in places where flow control determines
the variable's value is not live.
<p>This option does not guarantee that GCC generates code that has
this variable in the register you specify at all times. You may not
code an explicit reference to this register in the assembler
instruction template part of an <code>asm</code> statement and assume it
always refers to this variable.
However, using the variable as an input or output operand to the <code>asm</code>
guarantees that the specified register is used for that operand.
See <a href="Extended-Asm.html#Extended-Asm">Extended Asm</a>, for more information.
<p>Stores into local register variables may be deleted when they appear to be dead
according to dataflow analysis. References to local register variables may
be deleted or moved or simplified.
<p>As with global register variables, it is recommended that you choose a
register that is normally saved and restored by function calls on
your machine, so that library routines will not clobber it.
<p>Sometimes when writing inline <code>asm</code> code, you need to make an operand be a
specific register, but there's no matching constraint letter for that
register. To force the operand into that register, create a local variable
and specify the register in the variable's declaration. Then use the local
variable for the asm operand and specify any constraint letter that matches
the register:
<pre class="smallexample"> register int *p1 asm ("r0") = ...;
register int *p2 asm ("r1") = ...;
register int *result asm ("r0");
asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2));
</pre>
<p><em>Warning:</em> In the above example, be aware that a register (for example r0) can be
call-clobbered by subsequent code, including function calls and library calls
for arithmetic operators on other variables (for example the initialization
of p2). In this case, use temporary variables for expressions between the
register assignments:
<pre class="smallexample"> int t1 = ...;
register int *p1 asm ("r0") = ...;
register int *p2 asm ("r1") = t1;
register int *result asm ("r0");
asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2));
</pre>
</body></html>