blob: 446ad8a3430af6d049d52b58f7cec189fd0bebda [file] [log] [blame]
<html lang="en">
<head>
<title>Xtensa Branch Relaxation - Using as</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Using as">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="Xtensa-Relaxation.html#Xtensa-Relaxation" title="Xtensa Relaxation">
<link rel="next" href="Xtensa-Call-Relaxation.html#Xtensa-Call-Relaxation" title="Xtensa Call Relaxation">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU Assembler "as".
Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2006, 2007, 2008, 2009, 2010 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 no Invariant Sections, with no Front-Cover Texts, and with no
Back-Cover Texts. A copy of the license is included in the
section entitled ``GNU Free Documentation License''.
-->
<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>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Xtensa-Branch-Relaxation"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Xtensa-Call-Relaxation.html#Xtensa-Call-Relaxation">Xtensa Call Relaxation</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Xtensa-Relaxation.html#Xtensa-Relaxation">Xtensa Relaxation</a>
<hr>
</div>
<h5 class="subsubsection">9.42.4.1 Conditional Branch Relaxation</h5>
<p><a name="index-relaxation-of-branch-instructions-2025"></a><a name="index-branch-instructions_002c-relaxation-2026"></a>
When the target of a branch is too far away from the branch itself,
i.e., when the offset from the branch to the target is too large to fit
in the immediate field of the branch instruction, it may be necessary to
replace the branch with a branch around a jump. For example,
<pre class="smallexample"> beqz a2, L
</pre>
<p>may result in:
<pre class="smallexample"> bnez.n a2, M
j L
M:
</pre>
<p>(The <code>BNEZ.N</code> instruction would be used in this example only if the
density option is available. Otherwise, <code>BNEZ</code> would be used.)
<p>This relaxation works well because the unconditional jump instruction
has a much larger offset range than the various conditional branches.
However, an error will occur if a branch target is beyond the range of a
jump instruction. <samp><span class="command">as</span></samp> cannot relax unconditional jumps.
Similarly, an error will occur if the original input contains an
unconditional jump to a target that is out of range.
<p>Branch relaxation is enabled by default. It can be disabled by using
underscore prefixes (see <a href="Xtensa-Opcodes.html#Xtensa-Opcodes">Opcode Names</a>), the
&lsquo;<samp><span class="samp">--no-transform</span></samp>&rsquo; command-line option (see <a href="Xtensa-Options.html#Xtensa-Options">Command Line Options</a>), or the <code>no-transform</code> directive
(see <a href="Transform-Directive.html#Transform-Directive">transform</a>).
</body></html>