<html lang="en"> <head> <title>Xtensa Immediate Relaxation - Using as</title> <meta http-equiv="Content-Type" content="text/html"> <meta name="description" content="Using as"> <meta name="generator" content="makeinfo 4.7"> <link title="Top" rel="start" href="index.html#Top"> <link rel="up" href="Xtensa-Relaxation.html#Xtensa-Relaxation" title="Xtensa Relaxation"> <link rel="prev" 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, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002, 2006, 2007 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.1 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''. man end--> <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; } --></style> </head> <body> <div class="node"> <p> <a name="Xtensa-Immediate-Relaxation"></a>Previous: <a rel="previous" accesskey="p" href="Xtensa-Call-Relaxation.html#Xtensa-Call-Relaxation">Xtensa Call Relaxation</a>, Up: <a rel="up" accesskey="u" href="Xtensa-Relaxation.html#Xtensa-Relaxation">Xtensa Relaxation</a> <hr><br> </div> <h5 class="subsubsection">9.36.4.3 Other Immediate Field Relaxation</h5> <p><a name="index-immediate-fields_002c-relaxation-1868"></a><a name="index-relaxation-of-immediate-fields-1869"></a> The assembler normally performs the following other relaxations. They can be disabled by using underscore prefixes (see <a href="Xtensa-Opcodes.html#Xtensa-Opcodes">Opcode Names</a>), the <span class="samp">--no-transform</span> 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>). <p><a name="index-_0040code_007bMOVI_007d-instructions_002c-relaxation-1870"></a><a name="index-relaxation-of-_0040code_007bMOVI_007d-instructions-1871"></a>The <code>MOVI</code> machine instruction can only materialize values in the range from -2048 to 2047. Values outside this range are best materialized with <code>L32R</code> instructions. Thus: <pre class="smallexample"> movi a0, 100000 </pre> <p>is assembled into the following machine code: <pre class="smallexample"> .literal .L1, 100000 l32r a0, .L1 </pre> <p><a name="index-_0040code_007bL8UI_007d-instructions_002c-relaxation-1872"></a><a name="index-_0040code_007bL16SI_007d-instructions_002c-relaxation-1873"></a><a name="index-_0040code_007bL16UI_007d-instructions_002c-relaxation-1874"></a><a name="index-_0040code_007bL32I_007d-instructions_002c-relaxation-1875"></a><a name="index-relaxation-of-_0040code_007bL8UI_007d-instructions-1876"></a><a name="index-relaxation-of-_0040code_007bL16SI_007d-instructions-1877"></a><a name="index-relaxation-of-_0040code_007bL16UI_007d-instructions-1878"></a><a name="index-relaxation-of-_0040code_007bL32I_007d-instructions-1879"></a>The <code>L8UI</code> machine instruction can only be used with immediate offsets in the range from 0 to 255. The <code>L16SI</code> and <code>L16UI</code> machine instructions can only be used with offsets from 0 to 510. The <code>L32I</code> machine instruction can only be used with offsets from 0 to 1020. A load offset outside these ranges can be materialized with an <code>L32R</code> instruction if the destination register of the load is different than the source address register. For example: <pre class="smallexample"> l32i a1, a0, 2040 </pre> <p>is translated to: <pre class="smallexample"> .literal .L1, 2040 l32r a1, .L1 add a1, a0, a1 l32i a1, a1, 0 </pre> <p class="noindent">If the load destination and source address register are the same, an out-of-range offset causes an error. <p><a name="index-_0040code_007bADDI_007d-instructions_002c-relaxation-1880"></a><a name="index-relaxation-of-_0040code_007bADDI_007d-instructions-1881"></a>The Xtensa <code>ADDI</code> instruction only allows immediate operands in the range from -128 to 127. There are a number of alternate instruction sequences for the <code>ADDI</code> operation. First, if the immediate is 0, the <code>ADDI</code> will be turned into a <code>MOV.N</code> instruction (or the equivalent <code>OR</code> instruction if the code density option is not available). If the <code>ADDI</code> immediate is outside of the range -128 to 127, but inside the range -32896 to 32639, an <code>ADDMI</code> instruction or <code>ADDMI</code>/<code>ADDI</code> sequence will be used. Finally, if the immediate is outside of this range and a free register is available, an <code>L32R</code>/<code>ADD</code> sequence will be used with a literal allocated from the literal pool. <p>For example: <pre class="smallexample"> addi a5, a6, 0 addi a5, a6, 512 addi a5, a6, 513 addi a5, a6, 50000 </pre> <p>is assembled into the following: <pre class="smallexample"> .literal .L1, 50000 mov.n a5, a6 addmi a5, a6, 0x200 addmi a5, a6, 0x200 addi a5, a5, 1 l32r a5, .L1 add a5, a6, a5 </pre> </body></html>