hc
2023-11-07 f45e756958099c35d6afb746df1d40a1c6302cfc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2016 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. -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNU Compiler Collection (GCC): Local Register Variables</title>
 
<meta name="description" content="Using the GNU Compiler Collection (GCC): Local Register Variables">
<meta name="keywords" content="Using the GNU Compiler Collection (GCC): Local Register Variables">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Explicit-Register-Variables.html#Explicit-Register-Variables" rel="up" title="Explicit Register Variables">
<link href="Size-of-an-asm.html#Size-of-an-asm" rel="next" title="Size of an asm">
<link href="Global-Register-Variables.html#Global-Register-Variables" rel="prev" title="Global Register Variables">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Local-Register-Variables"></a>
<div class="header">
<p>
Previous: <a href="Global-Register-Variables.html#Global-Register-Variables" accesskey="p" rel="prev">Global Register Variables</a>, Up: <a href="Explicit-Register-Variables.html#Explicit-Register-Variables" accesskey="u" rel="up">Explicit Register Variables</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Specifying-Registers-for-Local-Variables"></a>
<h4 class="subsubsection">6.44.5.2 Specifying Registers for Local Variables</h4>
<a name="Local-Reg-Vars"></a><a name="index-local-variables_002c-specifying-registers"></a>
<a name="index-specifying-registers-for-local-variables"></a>
<a name="index-registers-for-local-variables"></a>
 
<p>You can define a local register variable and associate it with a specified 
register like this:
</p>
<div class="smallexample">
<pre class="smallexample">register int *foo asm (&quot;r12&quot;);
</pre></div>
 
<p>Here <code>r12</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 the declaration appears within a function.  The 
<code>register</code> keyword is required, and cannot be combined with 
<code>static</code>.  The register name must be a valid register name for the
target platform.
</p>
<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 calls to library routines will not clobber it.
</p>
<p>The only supported use for this feature is to specify registers
for input and output operands when calling Extended <code>asm</code> 
(see <a href="Extended-Asm.html#Extended-Asm">Extended Asm</a>).  This may be necessary if the constraints for a 
particular machine don&rsquo;t provide sufficient control to select the desired 
register.  To force an operand into a register, create a local variable 
and specify the register name after the variable&rsquo;s declaration.  Then use 
the local variable for the <code>asm</code> operand and specify any constraint 
letter that matches the register:
</p>
<div class="smallexample">
<pre class="smallexample">register int *p1 asm (&quot;r0&quot;) = &hellip;;
register int *p2 asm (&quot;r1&quot;) = &hellip;;
register int *result asm (&quot;r0&quot;);
asm (&quot;sysint&quot; : &quot;=r&quot; (result) : &quot;0&quot; (p1), &quot;r&quot; (p2));
</pre></div>
 
<p><em>Warning:</em> In the above example, be aware that a register (for example 
<code>r0</code>) can be call-clobbered by subsequent code, including function 
calls and library calls for arithmetic operators on other variables (for 
example the initialization of <code>p2</code>).  In this case, use temporary 
variables for expressions between the register assignments:
</p>
<div class="smallexample">
<pre class="smallexample">int t1 = &hellip;;
register int *p1 asm (&quot;r0&quot;) = &hellip;;
register int *p2 asm (&quot;r1&quot;) = t1;
register int *result asm (&quot;r0&quot;);
asm (&quot;sysint&quot; : &quot;=r&quot; (result) : &quot;0&quot; (p1), &quot;r&quot; (p2));
</pre></div>
 
<p>Defining a register variable does not reserve the register.  Other than
when invoking the Extended <code>asm</code>, the contents of the specified 
register are not guaranteed.  For this reason, the following uses 
are explicitly <em>not</em> supported.  If they appear to work, it is only 
happenstance, and may stop working as intended due to (seemingly) 
unrelated changes in surrounding code, or even minor changes in the 
optimization of a future version of gcc:
</p>
<ul>
<li> Passing parameters to or from Basic <code>asm</code>
</li><li> Passing parameters to or from Extended <code>asm</code> without using input 
or output operands.
</li><li> Passing parameters to or from routines written in assembler (or
other languages) using non-standard calling conventions.
</li></ul>
 
<p>Some developers use Local Register Variables in an attempt to improve 
gcc&rsquo;s allocation of registers, especially in large functions.  In this 
case the register name is essentially a hint to the register allocator.
While in some instances this can generate better code, improvements are
subject to the whims of the allocator/optimizers.  Since there are no
guarantees that your improvements won&rsquo;t be lost, this usage of Local
Register Variables is discouraged.
</p>
<p>On the MIPS platform, there is related use for local register variables 
with slightly different characteristics (see <a href="http://gcc.gnu.org/onlinedocs/gccint/MIPS-Coprocessors.html#MIPS-Coprocessors">Defining coprocessor specifics for MIPS targets</a> in <cite>GNU Compiler Collection (GCC) Internals</cite>).
</p>
<hr>
<div class="header">
<p>
Previous: <a href="Global-Register-Variables.html#Global-Register-Variables" accesskey="p" rel="prev">Global Register Variables</a>, Up: <a href="Explicit-Register-Variables.html#Explicit-Register-Variables" accesskey="u" rel="up">Explicit Register Variables</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>