blob: 693e4f988ef8e33aec34a0accd8b6e7e1c0f1651 [file] [log] [blame]
<!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: Insn Lengths</title>
<meta name="description" content="GNU Compiler Collection (GCC) Internals: Insn Lengths">
<meta name="keywords" content="GNU Compiler Collection (GCC) Internals: Insn Lengths">
<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="Insn-Attributes.html#Insn-Attributes" rel="up" title="Insn Attributes">
<link href="Constant-Attributes.html#Constant-Attributes" rel="next" title="Constant Attributes">
<link href="Attr-Example.html#Attr-Example" rel="prev" title="Attr Example">
<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="Insn-Lengths"></a>
<div class="header">
<p>
Next: <a href="Constant-Attributes.html#Constant-Attributes" accesskey="n" rel="next">Constant Attributes</a>, Previous: <a href="Attr-Example.html#Attr-Example" accesskey="p" rel="prev">Attr Example</a>, Up: <a href="Insn-Attributes.html#Insn-Attributes" accesskey="u" rel="up">Insn Attributes</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="Computing-the-Length-of-an-Insn"></a>
<h4 class="subsection">16.19.5 Computing the Length of an Insn</h4>
<a name="index-insn-lengths_002c-computing"></a>
<a name="index-computing-the-length-of-an-insn"></a>
<p>For many machines, multiple types of branch instructions are provided, each
for different length branch displacements. In most cases, the assembler
will choose the correct instruction to use. However, when the assembler
cannot do so, GCC can when a special attribute, the <code>length</code>
attribute, is defined. This attribute must be defined to have numeric
values by specifying a null string in its <code>define_attr</code>.
</p>
<p>In the case of the <code>length</code> attribute, two additional forms of
arithmetic terms are allowed in test expressions:
</p>
<dl compact="compact">
<dd><a name="index-match_005fdup-and-attributes"></a>
</dd>
<dt><code>(match_dup <var>n</var>)</code></dt>
<dd><p>This refers to the address of operand <var>n</var> of the current insn, which
must be a <code>label_ref</code>.
</p>
<a name="index-pc-and-attributes"></a>
</dd>
<dt><code>(pc)</code></dt>
<dd><p>For non-branch instructions and backward branch instructions, this refers
to the address of the current insn. But for forward branch instructions,
this refers to the address of the next insn, because the length of the
current insn is to be computed.
</p></dd>
</dl>
<a name="index-addr_005fvec_002c-length-of"></a>
<a name="index-addr_005fdiff_005fvec_002c-length-of"></a>
<p>For normal insns, the length will be determined by value of the
<code>length</code> attribute. In the case of <code>addr_vec</code> and
<code>addr_diff_vec</code> insn patterns, the length is computed as
the number of vectors multiplied by the size of each vector.
</p>
<p>Lengths are measured in addressable storage units (bytes).
</p>
<p>The following macros can be used to refine the length computation:
</p>
<dl compact="compact">
<dd><a name="index-ADJUST_005fINSN_005fLENGTH"></a>
</dd>
<dt><code>ADJUST_INSN_LENGTH (<var>insn</var>, <var>length</var>)</code></dt>
<dd><p>If defined, modifies the length assigned to instruction <var>insn</var> as a
function of the context in which it is used. <var>length</var> is an lvalue
that contains the initially computed length of the insn and should be
updated with the correct length of the insn.
</p>
<p>This macro will normally not be required. A case in which it is
required is the ROMP. On this machine, the size of an <code>addr_vec</code>
insn must be increased by two to compensate for the fact that alignment
may be required.
</p></dd>
</dl>
<a name="index-get_005fattr_005flength"></a>
<p>The routine that returns <code>get_attr_length</code> (the value of the
<code>length</code> attribute) can be used by the output routine to
determine the form of the branch instruction to be written, as the
example below illustrates.
</p>
<p>As an example of the specification of variable-length branches, consider
the IBM 360. If we adopt the convention that a register will be set to
the starting address of a function, we can jump to labels within 4k of
the start using a four-byte instruction. Otherwise, we need a six-byte
sequence to load the address from memory and then branch to it.
</p>
<p>On such a machine, a pattern for a branch instruction might be specified
as follows:
</p>
<div class="smallexample">
<pre class="smallexample">(define_insn &quot;jump&quot;
[(set (pc)
(label_ref (match_operand 0 &quot;&quot; &quot;&quot;)))]
&quot;&quot;
{
return (get_attr_length (insn) == 4
? &quot;b %l0&quot; : &quot;l r15,=a(%l0); br r15&quot;);
}
[(set (attr &quot;length&quot;)
(if_then_else (lt (match_dup 0) (const_int 4096))
(const_int 4)
(const_int 6)))])
</pre></div>
<hr>
<div class="header">
<p>
Next: <a href="Constant-Attributes.html#Constant-Attributes" accesskey="n" rel="next">Constant Attributes</a>, Previous: <a href="Attr-Example.html#Attr-Example" accesskey="p" rel="prev">Attr Example</a>, Up: <a href="Insn-Attributes.html#Insn-Attributes" accesskey="u" rel="up">Insn Attributes</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>