aarch64: Tweak movti and movtf patterns
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 30 Sep 2020 10:52:06 +0000 (11:52 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Wed, 30 Sep 2020 10:52:06 +0000 (11:52 +0100)
commitd4f9e81976066e1d67c8dd5ddaf24ebe3b0695ed
tree8707fbaee9b6f6dba8166470df3b42c3aa1e01b5
parentf63023fafbbc13545fef67e6b32a55b48a945fcf
aarch64: Tweak movti and movtf patterns

movti lacked an way of zeroing an FPR, meaning that we'd do:

        mov     x0, 0
        mov     x1, 0
        fmov    d0, x0
        fmov    v0.d[1], x1

instead of just:

        movi    v0.2d, #0

movtf had the opposite problem for GPRs: we'd generate:

        movi    v0.2d, #0
        fmov    x0, d0
        fmov    x1, v0.d[1]

instead of just:

        mov     x0, 0
        mov     x1, 0

Also, there was an unnecessary earlyclobber on the GPR<-GPR movtf
alternative (but not the movti one).  The splitter handles overlap
correctly.

The TF splitter used aarch64_reg_or_imm, but the _imm part only
accepts integer constants, not floating-point ones.  The patch
changes it to nonmemory_operand instead.

gcc/
* config/aarch64/aarch64.c (aarch64_split_128bit_move_p): Add a
function comment.  Tighten check for FP moves.
* config/aarch64/aarch64.md (*movti_aarch64): Add a w<-Z alternative.
(*movtf_aarch64): Handle r<-Y like r<-r.  Remove unnecessary
earlyclobber.  Change splitter predicate from aarch64_reg_or_imm
to nonmemory_operand.

gcc/testsuite/
* gcc.target/aarch64/movtf_1.c: New test.
* gcc.target/aarch64/movti_1.c: Likewise.
gcc/config/aarch64/aarch64.c
gcc/config/aarch64/aarch64.md
gcc/testsuite/gcc.target/aarch64/movtf_1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/movti_1.c [new file with mode: 0644]