1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
2<html>
3<!-- This file documents the GNU Assembler "as".
4
5Copyright (C) 1991-2021 Free Software Foundation, Inc.
6
7Permission is granted to copy, distribute and/or modify this document
8under the terms of the GNU Free Documentation License, Version 1.3
9or any later version published by the Free Software Foundation;
10with no Invariant Sections, with no Front-Cover Texts, and with no
11Back-Cover Texts.  A copy of the license is included in the
12section entitled "GNU Free Documentation License".
13 -->
14<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
15<head>
16<title>Using as: Xtensa Call Relaxation</title>
17
18<meta name="description" content="Using as: Xtensa Call Relaxation">
19<meta name="keywords" content="Using as: Xtensa Call Relaxation">
20<meta name="resource-type" content="document">
21<meta name="distribution" content="global">
22<meta name="Generator" content="makeinfo">
23<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
24<link href="index.html#Top" rel="start" title="Top">
25<link href="AS-Index.html#AS-Index" rel="index" title="AS Index">
26<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
27<link href="Xtensa-Relaxation.html#Xtensa-Relaxation" rel="up" title="Xtensa Relaxation">
28<link href="Xtensa-Jump-Relaxation.html#Xtensa-Jump-Relaxation" rel="next" title="Xtensa Jump Relaxation">
29<link href="Xtensa-Branch-Relaxation.html#Xtensa-Branch-Relaxation" rel="previous" title="Xtensa Branch Relaxation">
30<style type="text/css">
31<!--
32a.summary-letter {text-decoration: none}
33blockquote.smallquotation {font-size: smaller}
34div.display {margin-left: 3.2em}
35div.example {margin-left: 3.2em}
36div.indentedblock {margin-left: 3.2em}
37div.lisp {margin-left: 3.2em}
38div.smalldisplay {margin-left: 3.2em}
39div.smallexample {margin-left: 3.2em}
40div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
41div.smalllisp {margin-left: 3.2em}
42kbd {font-style:oblique}
43pre.display {font-family: inherit}
44pre.format {font-family: inherit}
45pre.menu-comment {font-family: serif}
46pre.menu-preformatted {font-family: serif}
47pre.smalldisplay {font-family: inherit; font-size: smaller}
48pre.smallexample {font-size: smaller}
49pre.smallformat {font-family: inherit; font-size: smaller}
50pre.smalllisp {font-size: smaller}
51span.nocodebreak {white-space:nowrap}
52span.nolinebreak {white-space:nowrap}
53span.roman {font-family:serif; font-weight:normal}
54span.sansserif {font-family:sans-serif; font-weight:normal}
55ul.no-bullet {list-style: none}
56-->
57</style>
58
59
60</head>
61
62<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
63<a name="Xtensa-Call-Relaxation"></a>
64<div class="header">
65<p>
66Next: <a href="Xtensa-Jump-Relaxation.html#Xtensa-Jump-Relaxation" accesskey="n" rel="next">Xtensa Jump Relaxation</a>, Previous: <a href="Xtensa-Branch-Relaxation.html#Xtensa-Branch-Relaxation" accesskey="p" rel="previous">Xtensa Branch Relaxation</a>, Up: <a href="Xtensa-Relaxation.html#Xtensa-Relaxation" accesskey="u" rel="up">Xtensa Relaxation</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="AS-Index.html#AS-Index" title="Index" rel="index">Index</a>]</p>
67</div>
68<hr>
69<a name="Function-Call-Relaxation"></a>
70<h4 class="subsubsection">9.55.4.2 Function Call Relaxation</h4>
71<a name="index-relaxation-of-call-instructions"></a>
72<a name="index-call-instructions_002c-relaxation"></a>
73
74<p>Function calls may require relaxation because the Xtensa immediate call
75instructions (<code>CALL0</code>, <code>CALL4</code>, <code>CALL8</code> and
76<code>CALL12</code>) provide a PC-relative offset of only 512 Kbytes in either
77direction.  For larger programs, it may be necessary to use indirect
78calls (<code>CALLX0</code>, <code>CALLX4</code>, <code>CALLX8</code> and <code>CALLX12</code>)
79where the target address is specified in a register.  The Xtensa
80assembler can automatically relax immediate call instructions into
81indirect call instructions.  This relaxation is done by loading the
82address of the called function into the callee&rsquo;s return address register
83and then using a <code>CALLX</code> instruction.  So, for example:
84</p>
85<div class="smallexample">
86<pre class="smallexample">    call8 func
87</pre></div>
88
89<p>might be relaxed to:
90</p>
91<div class="smallexample">
92<pre class="smallexample">    .literal .L1, func
93    l32r    a8, .L1
94    callx8  a8
95</pre></div>
96
97<p>Because the addresses of targets of function calls are not generally
98known until link-time, the assembler must assume the worst and relax all
99the calls to functions in other source files, not just those that really
100will be out of range.  The linker can recognize calls that were
101unnecessarily relaxed, and it will remove the overhead introduced by the
102assembler for those cases where direct calls are sufficient.
103</p>
104<p>Call relaxation is disabled by default because it can have a negative
105effect on both code size and performance, although the linker can
106usually eliminate the unnecessary overhead.  If a program is too large
107and some of the calls are out of range, function call relaxation can be
108enabled using the &lsquo;<samp>--longcalls</samp>&rsquo; command-line option or the
109<code>longcalls</code> directive (see <a href="Longcalls-Directive.html#Longcalls-Directive">longcalls</a>).
110</p>
111
112
113
114</body>
115</html>
116