This patch is dependant on "[AArch64] [BE] [1/2] Make large opaque integer modes endianness-safe.”
It fixes up movoi/ci/xi for Big Endian, so that we end up with the lsb of
a big-endian integer to be in the low byte of the highest-numbered
register.
movoi uses stp/ldp
movxi needs a split version (which is shared with register->register
movxi), which just splits to two new movs
movci can then split to three movs. A future patch will instead split to
an movoi and a movti.
There are no changes for LE.
Ran whole of check with both parts of "Make large opaque integer modes
endianness-safe”. No regressions.
ChangeLog:
gcc/:
2014-10-10 Alan Hayward <[email protected]>
* config/aarch64/aarch64.c
(aarch64_classify_address): Allow extra addressing modes for BE.
(aarch64_print_operand): new operand for printing a q register+1.
(aarch64_simd_emit_reg_reg_move): replacement for
aarch64_simd_disambiguate_copy that plants the required mov.
* config/aarch64/aarch64-protos.h
(aarch64_simd_emit_reg_reg_move): replacement for
aarch64_simd_disambiguate_copy.
* config/aarch64/aarch64-simd.md
(define_split) Use new aarch64_simd_emit_reg_reg_move.
(define_expand "mov<mode>") less restrictive predicates.
(define_insn "*aarch64_mov<mode>") Simplify and only allow for LE.
(define_insn "*aarch64_be_movoi") New. BE only. Plant ldp or stp.
(define_insn "*aarch64_be_movci") New. BE only. No instructions.
(define_insn "*aarch64_be_movxi") New. BE only. No instructions.
(define_split) OI mov. Use new aarch64_simd_emit_reg_reg_move.
(define_split) CI mov. Use new aarch64_simd_emit_reg_reg_move.
On BE
plant movs for reg to/from mem case.
(define_split) XI mov. Use new aarch64_simd_emit_reg_reg_move.
On BE
plant movs for reg to/from mem case.
0001-be-mov.patch
Description: Binary data
