On Tue, May 22, 2018 at 08:13:22AM -0500, Kyrill Tkachov wrote:
> [sending on behalf of Jackson Woodruff]
> 
> Hi all,
> 
> This patch merges loads and stores from D-registers that are of different 
> modes.
> 
> Code like this:
> 
>      typedef int __attribute__((vector_size(8))) vec;
>      struct pair
>      {
>        vec v;
>        double d;
>      }
> 
> Now generates a store pair instruction:
> 
>      void
>      assign (struct pair *p, vec v)
>      {
>        p->v = v;
>        p->d = 1.0;
>      }
> 
> Whereas previously it generated two `str` instructions.
> 
> This patch also merges storing of double zero values with
> long integer values:
> 
>      struct pair
>      {
>        long long l;
>        double d;
>      }
> 
>      void
>      foo (struct pair *p)
>      {
>        p->l = 10;
>        p->d = 0.0;
>      }
> 
> Now generates a single store pair instruction rather than two `str` 
> instructions.
> 
> The patch basically generalises the mode iterators on the patterns in 
> aarch64.md
> and the peepholes in aarch64-ldpstp.md to take all combinations of pairs of 
> modes
> so, while it may be a large-ish patch, it does fairly mechanical stuff.
> 
> Bootstrap and testsuite run OK. OK for trunk?

OK for trunk.

Thanks,
James

> 
> Jackson
> 
> 2018-05-22  Jackson Woodruff  <[email protected]>
>              Kyrylo Tkachov  <[email protected]>
> 
>      * config/aarch64/aarch64.md: New patterns to generate stp
>      and ldp.
>      (store_pair_sw, store_pair_dw): New patterns to generate stp for
>      single words and double words.
>      (load_pair_sw, load_pair_dw): Likewise.
>      (store_pair_sf, store_pair_df, store_pair_si, store_pair_di):
>      Delete.
>      (load_pair_sf, load_pair_df, load_pair_si, load_pair_di):
>      Delete.
>      * config/aarch64/aarch64-ldpstp.md: Modify peephole
>      for different mode ldpstp and add peephole for merged zero stores.
>      Likewise for loads.
>      * config/aarch64/aarch64.c (aarch64_operands_ok_for_ldpstp):
>      Add size check.
>      (aarch64_gen_store_pair): Rename calls to match new patterns.
>      (aarch64_gen_load_pair): Rename calls to match new patterns.
>      * config/aarch64/aarch64-simd.md (load_pair<mode>): Rename to...
>      (load_pair<DREG:mode><DREG2:mode>): ... This.
>      (store_pair<mode>): Rename to...
>      (vec_store_pair<DREG:mode><DREG2:mode>): ... This.
>      * config/aarch64/iterators.md (DREG, DREG2, DX2, SX, SX2, DSX):
>      New mode iterators.
>      (V_INT_EQUIV): Handle SImode.
>      * config/aarch64/predicates.md (aarch64_reg_zero_or_fp_zero):
>      New predicate.
> 
> 
> 2018-05-22  Jackson Woodruff  <[email protected]>
> 
>      * gcc.target/aarch64/ldp_stp_6.c: New.
>      * gcc.target/aarch64/ldp_stp_7.c: New.
>      * gcc.target/aarch64/ldp_stp_8.c: New.

Reply via email to