| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <!-- 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. --> |
| <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ --> |
| <head> |
| <title>GNU Compiler Collection (GCC) Internals: Register Basics</title> |
| |
| <meta name="description" content="GNU Compiler Collection (GCC) Internals: Register Basics"> |
| <meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Register Basics"> |
| <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="Registers.html#Registers" rel="up" title="Registers"> |
| <link href="Allocation-Order.html#Allocation-Order" rel="next" title="Allocation Order"> |
| <link href="Registers.html#Registers" rel="prev" title="Registers"> |
| <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="Register-Basics"></a> |
| <div class="header"> |
| <p> |
| Next: <a href="Allocation-Order.html#Allocation-Order" accesskey="n" rel="next">Allocation Order</a>, Up: <a href="Registers.html#Registers" accesskey="u" rel="up">Registers</a> [<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="Basic-Characteristics-of-Registers"></a> |
| <h4 class="subsection">17.7.1 Basic Characteristics of Registers</h4> |
| |
| <p>Registers have various characteristics. |
| </p> |
| <dl> |
| <dt><a name="index-FIRST_005fPSEUDO_005fREGISTER"></a>Macro: <strong>FIRST_PSEUDO_REGISTER</strong></dt> |
| <dd><p>Number of hardware registers known to the compiler. They receive |
| numbers 0 through <code>FIRST_PSEUDO_REGISTER-1</code>; thus, the first |
| pseudo register’s number really is assigned the number |
| <code>FIRST_PSEUDO_REGISTER</code>. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-FIXED_005fREGISTERS"></a>Macro: <strong>FIXED_REGISTERS</strong></dt> |
| <dd><a name="index-fixed-register"></a> |
| <p>An initializer that says which registers are used for fixed purposes |
| all throughout the compiled code and are therefore not available for |
| general allocation. These would include the stack pointer, the frame |
| pointer (except on machines where that can be used as a general |
| register when no frame pointer is needed), the program counter on |
| machines where that is considered one of the addressable registers, |
| and any other numbered register with a standard use. |
| </p> |
| <p>This information is expressed as a sequence of numbers, separated by |
| commas and surrounded by braces. The <var>n</var>th number is 1 if |
| register <var>n</var> is fixed, 0 otherwise. |
| </p> |
| <p>The table initialized from this macro, and the table initialized by |
| the following one, may be overridden at run time either automatically, |
| by the actions of the macro <code>CONDITIONAL_REGISTER_USAGE</code>, or by |
| the user with the command options <samp>-ffixed-<var>reg</var></samp>, |
| <samp>-fcall-used-<var>reg</var></samp> and <samp>-fcall-saved-<var>reg</var></samp>. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-CALL_005fUSED_005fREGISTERS"></a>Macro: <strong>CALL_USED_REGISTERS</strong></dt> |
| <dd><a name="index-call_002dused-register"></a> |
| <a name="index-call_002dclobbered-register"></a> |
| <a name="index-call_002dsaved-register"></a> |
| <p>Like <code>FIXED_REGISTERS</code> but has 1 for each register that is |
| clobbered (in general) by function calls as well as for fixed |
| registers. This macro therefore identifies the registers that are not |
| available for general allocation of values that must live across |
| function calls. |
| </p> |
| <p>If a register has 0 in <code>CALL_USED_REGISTERS</code>, the compiler |
| automatically saves it on function entry and restores it on function |
| exit, if the register is used within the function. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-CALL_005fREALLY_005fUSED_005fREGISTERS"></a>Macro: <strong>CALL_REALLY_USED_REGISTERS</strong></dt> |
| <dd><a name="index-call_002dused-register-1"></a> |
| <a name="index-call_002dclobbered-register-1"></a> |
| <a name="index-call_002dsaved-register-1"></a> |
| <p>Like <code>CALL_USED_REGISTERS</code> except this macro doesn’t require |
| that the entire set of <code>FIXED_REGISTERS</code> be included. |
| (<code>CALL_USED_REGISTERS</code> must be a superset of <code>FIXED_REGISTERS</code>). |
| This macro is optional. If not specified, it defaults to the value |
| of <code>CALL_USED_REGISTERS</code>. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-HARD_005fREGNO_005fCALL_005fPART_005fCLOBBERED"></a>Macro: <strong>HARD_REGNO_CALL_PART_CLOBBERED</strong> <em>(<var>regno</var>, <var>mode</var>)</em></dt> |
| <dd><a name="index-call_002dused-register-2"></a> |
| <a name="index-call_002dclobbered-register-2"></a> |
| <a name="index-call_002dsaved-register-2"></a> |
| <p>A C expression that is nonzero if it is not permissible to store a |
| value of mode <var>mode</var> in hard register number <var>regno</var> across a |
| call without some part of it being clobbered. For most machines this |
| macro need not be defined. It is only required for machines that do not |
| preserve the entire contents of a register across a call. |
| </p></dd></dl> |
| |
| <a name="index-fixed_005fregs"></a> |
| <a name="index-call_005fused_005fregs"></a> |
| <a name="index-global_005fregs"></a> |
| <a name="index-reg_005fnames"></a> |
| <a name="index-reg_005fclass_005fcontents"></a> |
| <dl> |
| <dt><a name="index-TARGET_005fCONDITIONAL_005fREGISTER_005fUSAGE"></a>Target Hook: <em>void</em> <strong>TARGET_CONDITIONAL_REGISTER_USAGE</strong> <em>(void)</em></dt> |
| <dd><p>This hook may conditionally modify five variables |
| <code>fixed_regs</code>, <code>call_used_regs</code>, <code>global_regs</code>, |
| <code>reg_names</code>, and <code>reg_class_contents</code>, to take into account |
| any dependence of these register sets on target flags. The first three |
| of these are of type <code>char []</code> (interpreted as Boolean vectors). |
| <code>global_regs</code> is a <code>const char *[]</code>, and |
| <code>reg_class_contents</code> is a <code>HARD_REG_SET</code>. Before the macro is |
| called, <code>fixed_regs</code>, <code>call_used_regs</code>, |
| <code>reg_class_contents</code>, and <code>reg_names</code> have been initialized |
| from <code>FIXED_REGISTERS</code>, <code>CALL_USED_REGISTERS</code>, |
| <code>REG_CLASS_CONTENTS</code>, and <code>REGISTER_NAMES</code>, respectively. |
| <code>global_regs</code> has been cleared, and any <samp>-ffixed-<var>reg</var></samp>, |
| <samp>-fcall-used-<var>reg</var></samp> and <samp>-fcall-saved-<var>reg</var></samp> |
| command options have been applied. |
| </p> |
| <a name="index-disabling-certain-registers"></a> |
| <a name="index-controlling-register-usage"></a> |
| <p>If the usage of an entire class of registers depends on the target |
| flags, you may indicate this to GCC by using this macro to modify |
| <code>fixed_regs</code> and <code>call_used_regs</code> to 1 for each of the |
| registers in the classes which should not be used by GCC. Also define |
| the macro <code>REG_CLASS_FROM_LETTER</code> / <code>REG_CLASS_FROM_CONSTRAINT</code> |
| to return <code>NO_REGS</code> if it |
| is called with a letter for a class that shouldn’t be used. |
| </p> |
| <p>(However, if this class is not included in <code>GENERAL_REGS</code> and all |
| of the insn patterns whose constraints permit this class are |
| controlled by target switches, then GCC will automatically avoid using |
| these registers when the target switches are opposed to them.) |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-INCOMING_005fREGNO"></a>Macro: <strong>INCOMING_REGNO</strong> <em>(<var>out</var>)</em></dt> |
| <dd><p>Define this macro if the target machine has register windows. This C |
| expression returns the register number as seen by the called function |
| corresponding to the register number <var>out</var> as seen by the calling |
| function. Return <var>out</var> if register number <var>out</var> is not an |
| outbound register. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-OUTGOING_005fREGNO"></a>Macro: <strong>OUTGOING_REGNO</strong> <em>(<var>in</var>)</em></dt> |
| <dd><p>Define this macro if the target machine has register windows. This C |
| expression returns the register number as seen by the calling function |
| corresponding to the register number <var>in</var> as seen by the called |
| function. Return <var>in</var> if register number <var>in</var> is not an inbound |
| register. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-LOCAL_005fREGNO"></a>Macro: <strong>LOCAL_REGNO</strong> <em>(<var>regno</var>)</em></dt> |
| <dd><p>Define this macro if the target machine has register windows. This C |
| expression returns true if the register is call-saved but is in the |
| register window. Unlike most call-saved registers, such registers |
| need not be explicitly restored on function exit or during non-local |
| gotos. |
| </p></dd></dl> |
| |
| <dl> |
| <dt><a name="index-PC_005fREGNUM"></a>Macro: <strong>PC_REGNUM</strong></dt> |
| <dd><p>If the program counter has a register number, define this as that |
| register number. Otherwise, do not define it. |
| </p></dd></dl> |
| |
| <hr> |
| <div class="header"> |
| <p> |
| Next: <a href="Allocation-Order.html#Allocation-Order" accesskey="n" rel="next">Allocation Order</a>, Up: <a href="Registers.html#Registers" accesskey="u" rel="up">Registers</a> [<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> |