MIPS16/GAS: Relax 32-bit non-PIC PC-relative synthetic instructions
authorMaciej W. Rozycki <macro@imgtec.com>
Wed, 3 May 2017 19:43:10 +0000 (20:43 +0100)
committerMaciej W. Rozycki <macro@imgtec.com>
Wed, 3 May 2017 19:47:40 +0000 (20:47 +0100)
commit8507b6e79772ffeb83a0142d12a63e02dcc44562
tree0952e6c10d5abbb11afa9cb6cee1903b44ec30ba
parent90cef2edd256c48d2ff9a03d4a6c1bcb575db07c
MIPS16/GAS: Relax 32-bit non-PIC PC-relative synthetic instructions

Implement the relaxation of MIPS16 PC-relative synthetic LA, DLA, LW and
LD instructions to an equivalent sequence of instructions produced where
the address operand requested is out of range, absolute or requires
linker relocation, for ABIs that use 32-bit addressing and non-PIC code.

The sequence generated uses the register specified for the destination
operand as a temporary and begins with LI to load the high 16-bit part
of the address, then continues with SLL by 16 bits to move that part
into place and finally completes with a suitable operation corresponding
to the synthetic instruction used, one of: 2-argument ADDIU, 2-argument
DADDIU, absolute LW, and absolute LD respectively, providing the low
16-bit part of the address.  All instructions use the extended encoding.
As a special exception accept absolute addresses for relaxation even in
PIC code.

For example:

la $2, 0x12345678

produces code as:

li $2, 0x1234
sll $2, $2, 16
addiu $2, 0x5678

would.

Where linker relocation is required emit an R_MIPS16_HI16 relocation on
the initial LI instruction and an R_MIPS16_LO16 relocation on the final
operation.

For example (where `foo' is not local):

lw $3, foo

produces code as:

li $3, %hi(foo)
sll $3, $3, 16
lw $3, %lo(foo)($3)

would.

Emit assembly warnings as appropriate where this new relaxation triggers
in the `nomacro' mode or for an instruction manually placed in a branch
delay slot in the `noreorder' mode.  Refrain from relaxation where an
explicit instruction size suffix has been used and in the `noautoextend'
mode.

gas/
* config/tc-mips.c (RELAX_MIPS16_ENCODE): Add `pic', `sym32' and
`nomacro' flags.
(RELAX_MIPS16_PIC, RELAX_MIPS16_SYM32, RELAX_MIPS16_NOMACRO):
New macros.
(RELAX_MIPS16_USER_SMALL, RELAX_MIPS16_USER_EXT)
(RELAX_MIPS16_DSLOT, RELAX_MIPS16_JAL_DSLOT)
(RELAX_MIPS16_EXTENDED, RELAX_MIPS16_MARK_EXTENDED)
(RELAX_MIPS16_CLEAR_EXTENDED, RELAX_MIPS16_ALWAYS_EXTENDED)
(RELAX_MIPS16_MARK_ALWAYS_EXTENDED)
(RELAX_MIPS16_CLEAR_ALWAYS_EXTENDED): Shift bits.
(RELAX_MIPS16_MACRO, RELAX_MIPS16_MARK_MACRO)
(RELAX_MIPS16_CLEAR_MACRO): New macros.
(append_insn): Pass `mips_pic', HAVE_32BIT_SYMBOLS and
`mips_opts.warn_about_macros' settings to RELAX_MIPS16_ENCODE.
(mips16_macro_frag): New function.
(md_estimate_size_before_relax): Handle HI16/LO16 relaxation.
(mips_relax_frag): Likewise.
(md_convert_frag): Likewise.

* testsuite/gas/mips/mips16@relax-swap3.d: Remove error output,
add dump patterns.
* testsuite/gas/mips/mips16e@relax-swap3.d: New test
subarchitecture.
* testsuite/gas/mips/micromips@relax-swap3.d: Remove trailing
NOP padding.
* testsuite/gas/mips/mips16-pcrel-reloc-2.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-reloc-3.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-reloc-6.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-reloc-7.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-addend-2.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-addend-3.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-absolute.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16-pcrel-absolute-1.d: Remove error
output, add dump patterns.
* testsuite/gas/mips/mips16@relax-swap3.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-reloc-2.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-reloc-3.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-reloc-6.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-reloc-7.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-addend-2.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-addend-3.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-absolute.l: Remove file.
* testsuite/gas/mips/mips16-pcrel-absolute-1.l: Remove file.
* testsuite/gas/mips/relax-swap3.s: Adjust trailing padding.

* testsuite/gas/mips/mips16-pcrel-0.d: New test.
* testsuite/gas/mips/mips16-pcrel-1.d: New test.
* testsuite/gas/mips/mips16-pcrel-2.d: New test.
* testsuite/gas/mips/mips16-pcrel-3.d: New test.
* testsuite/gas/mips/mips16-pcrel-4.d: New test.
* testsuite/gas/mips/mips16-pcrel-5.d: New test.
* testsuite/gas/mips/mips16-pcrel-pic-0.d: New test.
* testsuite/gas/mips/mips16-pcrel-pic-1.d: New test.
* testsuite/gas/mips/mips16-pcrel-n32-0.d: New test.
* testsuite/gas/mips/mips16-pcrel-n32-1.d: New test.
* testsuite/gas/mips/mips16-pcrel-n64-sym32-0.d: New test.
* testsuite/gas/mips/mips16-pcrel-n64-sym32-1.d: New test.
* testsuite/gas/mips/mips16-pcrel-n64-0.d: New test.
* testsuite/gas/mips/mips16-pcrel-n64-1.d: New test.
* testsuite/gas/mips/mips16-pcrel-delay-0.d: New test.
* testsuite/gas/mips/mips16-pcrel-delay-1.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-4.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-5.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-6.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-7.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-8.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-9.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-pic-8.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-pic-9.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-n32-8.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-n32-9.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-n64-sym32-8.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-n64-sym32-9.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-n64-8.d: New test.
* testsuite/gas/mips/mips16-pcrel-addend-n64-9.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-2.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-3.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-4.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-5.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-6.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-7.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-4.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-6.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-n32-4.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-n32-6.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-n64-4.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-n64-6.d: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-n64-sym32-4.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-n64-sym32-6.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-n32-4.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-n32-6.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-4.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-6.d: New
test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-sym32-4.d:
New test.
* testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-sym32-6.d:
New test.
* testsuite/gas/mips/mips16-pcrel-0.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-1.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-2.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-3.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-4.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-5.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-delay-0.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-delay-1.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-addend-8.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-addend-9.l: New stderr output.
* testsuite/gas/mips/mips16-pcrel-absolute-4.l: New stderr
output.
* testsuite/gas/mips/mips16-pcrel-absolute-6.l: New stderr
output.
* testsuite/gas/mips/mips16-pcrel-0.s: New test source.
* testsuite/gas/mips/mips16-pcrel-1.s: New test source.
* testsuite/gas/mips/mips16-pcrel-2.s: New test source.
* testsuite/gas/mips/mips16-pcrel-3.s: New test source.
* testsuite/gas/mips/mips16-pcrel-4.s: New test source.
* testsuite/gas/mips/mips16-pcrel-5.s: New test source.
* testsuite/gas/mips/mips16-pcrel-delay-0.s: New test source.
* testsuite/gas/mips/mips16-pcrel-delay-1.s: New test source.
* testsuite/gas/mips/mips16-pcrel-addend-4.s: New test source.
* testsuite/gas/mips/mips16-pcrel-addend-5.s: New test source.
* testsuite/gas/mips/mips16-pcrel-addend-6.s: New test source.
* testsuite/gas/mips/mips16-pcrel-addend-7.s: New test source.
* testsuite/gas/mips/mips16-pcrel-addend-8.s: New test source.
* testsuite/gas/mips/mips16-pcrel-addend-9.s: New test source.
* testsuite/gas/mips/mips16-pcrel-absolute-2.s: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-3.s: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-4.s: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-5.s: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-6.s: New test.
* testsuite/gas/mips/mips16-pcrel-absolute-7.s: New test.
* testsuite/gas/mips/mips.exp: Run the new tests.

ld/
* testsuite/ld-mips-elf/mips16-pcrel-0.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-1.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-addend-2.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-addend-6.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-n32-0.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-n32-1.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-n64-sym32-0.d: New test.
* testsuite/ld-mips-elf/mips16-pcrel-n64-sym32-1.d: New test.
* testsuite/ld-mips-elf/mips-elf.exp: Run the new tests.
116 files changed:
gas/ChangeLog
gas/config/tc-mips.c
gas/testsuite/gas/mips/micromips@relax-swap3.d
gas/testsuite/gas/mips/mips.exp
gas/testsuite/gas/mips/mips16-pcrel-0.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-0.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-0.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-1.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-2.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-2.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-3.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-3.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-4.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-4.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-5.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-5.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-5.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-1.d
gas/testsuite/gas/mips/mips16-pcrel-absolute-1.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-absolute-2.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-2.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-3.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-3.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-4.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-4.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-5.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-5.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-6.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-6.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-7.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-7.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-n32-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-n32-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-n64-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-n64-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-n64-sym32-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-n64-sym32-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-n32-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-n32-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-sym32-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute-pic-n64-sym32-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-absolute.d
gas/testsuite/gas/mips/mips16-pcrel-absolute.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-addend-2.d
gas/testsuite/gas/mips/mips16-pcrel-addend-2.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-addend-3.d
gas/testsuite/gas/mips/mips16-pcrel-addend-3.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-addend-4.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-4.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-5.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-5.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-6.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-6.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-7.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-7.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-8.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-8.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-8.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-9.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-9.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-9.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-n32-8.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-n32-9.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-n64-8.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-n64-9.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-n64-sym32-8.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-n64-sym32-9.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-pic-8.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-addend-pic-9.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-delay-0.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-delay-0.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-delay-0.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-delay-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-delay-1.l [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-delay-1.s [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-n32-0.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-n32-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-n64-0.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-n64-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-n64-sym32-0.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-n64-sym32-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-pic-0.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-pic-1.d [new file with mode: 0644]
gas/testsuite/gas/mips/mips16-pcrel-reloc-2.d
gas/testsuite/gas/mips/mips16-pcrel-reloc-2.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-reloc-3.d
gas/testsuite/gas/mips/mips16-pcrel-reloc-3.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-reloc-6.d
gas/testsuite/gas/mips/mips16-pcrel-reloc-6.l [deleted file]
gas/testsuite/gas/mips/mips16-pcrel-reloc-7.d
gas/testsuite/gas/mips/mips16-pcrel-reloc-7.l [deleted file]
gas/testsuite/gas/mips/mips16@relax-swap3.d
gas/testsuite/gas/mips/mips16@relax-swap3.l [deleted file]
gas/testsuite/gas/mips/mips16e@relax-swap3.d [new file with mode: 0644]
gas/testsuite/gas/mips/relax-swap3.s
ld/ChangeLog
ld/testsuite/ld-mips-elf/mips-elf.exp
ld/testsuite/ld-mips-elf/mips16-pcrel-0.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-addend-2.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-addend-6.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-n32-0.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-n32-1.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-n64-sym32-0.d [new file with mode: 0644]
ld/testsuite/ld-mips-elf/mips16-pcrel-n64-sym32-1.d [new file with mode: 0644]