Hi,
I was surprised that GCC didn't support addressing modes like
[REG+OFF]/[REG_REG] for instructions ldr/str in vectorization scenarios.
The generated assembly is bad since all address expressions have to be
computed outside of memory reference.  The root cause is because aarch64
effectively rejects reg-indexing (and const-offset) addressing modes in
aarch64_classify_address and miscellaneous simd patterns.

By fixing this issue, performance of fp benchmarks can be obviously
improved.  It can also help vectorized int cases.

The patch passes bootstrap and regression test on aarch64/little-endian.  It
also passes regression test on aarch64/big-endian except for case
"gcc.target/aarch64/vect-mull.c".  I analyzed the failed case and now
believe it reveals a latent bug in vectorizer on aarch64/big-endian.  The
analysis report is posted at
https://gcc.gnu.org/ml/gcc-patches/2014-05/msg00182.html.  

So is it OK?

Thanks,
bin


2014-05-28  Bin Cheng  <bin.ch...@arm.com>

        * config/aarch64/aarch64.c (aarch64_classify_address)
        (aarch64_legitimize_reload_address): Support full addressing modes
        for vector modes.
        * config/aarch64/aarch64.md (mov<mode>, movmisalign<mode>)
        (*aarch64_simd_mov<mode>, *aarch64_simd_mov<mode>): Relax
predicates.



Reply via email to