as: Xtensa Immediate Relaxation
9.54.4.4 Other Immediate Field Relaxation
.........................................
The assembler normally performs the following other relaxations. They
DONTPRINTYET can be disabled by using underscore prefixes (Opcode Names Xtensa
Opcodes.), the '--no-transform' command-line option (*noteCommand-line
DONTPRINTYET DONTPRINTYET can be disabled by using underscore prefixes (Opcode Names Xtensa
Opcodes.), the '--no-transform' command-line option (Command-line
Options Xtensa Options.), or the 'no-transform' directive (*noteDONTPRINTYET DONTPRINTYET can be disabled by using underscore prefixes (Opcode Names Xtensa
Opcodes.), the '--no-transform' command-line option (Command-line
Options Xtensa Options.), or the 'no-transform' directive (
transform Transform Directive.).
The 'MOVI' machine instruction can only materialize values in the
range from -2048 to 2047. Values outside this range are best
materialized with 'L32R' instructions. Thus:
movi a0, 100000
is assembled into the following machine code:
.literal .L1, 100000
l32r a0, .L1
The 'L8UI' machine instruction can only be used with immediate
offsets in the range from 0 to 255. The 'L16SI' and 'L16UI' machine
instructions can only be used with offsets from 0 to 510. The 'L32I'
machine instruction can only be used with offsets from 0 to 1020. A
load offset outside these ranges can be materialized with an 'L32R'
instruction if the destination register of the load is different than
the source address register. For example:
l32i a1, a0, 2040
is translated to:
.literal .L1, 2040
l32r a1, .L1
add a1, a0, a1
l32i a1, a1, 0
If the load destination and source address register are the same, an
out-of-range offset causes an error.
The Xtensa 'ADDI' instruction only allows immediate operands in the
range from -128 to 127. There are a number of alternate instruction
sequences for the 'ADDI' operation. First, if the immediate is 0, the
'ADDI' will be turned into a 'MOV.N' instruction (or the equivalent 'OR'
instruction if the code density option is not available). If the 'ADDI'
immediate is outside of the range -128 to 127, but inside the range
-32896 to 32639, an 'ADDMI' instruction or 'ADDMI'/'ADDI' sequence will
be used. Finally, if the immediate is outside of this range and a free
register is available, an 'L32R'/'ADD' sequence will be used with a
literal allocated from the literal pool.
For example:
addi a5, a6, 0
addi a5, a6, 512
addi a5, a6, 513
addi a5, a6, 50000
is assembled into the following:
.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