Thanks a lot for doing this.

Jonathan Wright <jonathan.wri...@arm.com> writes:
> @@ -763,9 +839,16 @@ aarch64_lookup_simd_builtin_type (machine_mode mode,
>      return aarch64_simd_builtin_std_type (mode, q);
>  
>    for (i = 0; i < nelts; i++)
> -    if (aarch64_simd_types[i].mode == mode
> -     && aarch64_simd_types[i].q == q)
> -      return aarch64_simd_types[i].itype;
> +    {
> +      if (aarch64_simd_types[i].mode == mode
> +       && aarch64_simd_types[i].q == q)
> +     return aarch64_simd_types[i].itype;
> +      else if (aarch64_simd_tuple_types[i][0] != NULL_TREE)

Very minor (sorry for not noticing earlier), but: the “else” is
redundant here.

> +     for (int j = 0; j < 3; j++)
> +       if (TYPE_MODE (aarch64_simd_tuple_types[i][j]) == mode
> +           && aarch64_simd_types[i].q == q)
> +         return aarch64_simd_tuple_types[i][j];
> +    }
>  
>    return NULL_TREE;
>  }
> diff --git a/gcc/config/aarch64/aarch64-simd.md 
> b/gcc/config/aarch64/aarch64-simd.md
> index 
> 48eddf64e05afe3788abfa05141f6544a9323ea1..0aa185b67ff13d40c87db0449aec312929ff5387
>  100644
> --- a/gcc/config/aarch64/aarch64-simd.md
> +++ b/gcc/config/aarch64/aarch64-simd.md
> @@ -6636,162 +6636,165 @@
>  
>  ;; Patterns for vector struct loads and stores.
>  
> -(define_insn "aarch64_simd_ld2<mode>"
> -  [(set (match_operand:OI 0 "register_operand" "=w")
> -     (unspec:OI [(match_operand:OI 1 "aarch64_simd_struct_operand" "Utv")
> -                 (unspec:VQ [(const_int 0)] UNSPEC_VSTRUCTDUMMY)]
> -                UNSPEC_LD2))]
> +(define_insn "aarch64_simd_ld2<vstruct_elt>"
> +  [(set (match_operand:VSTRUCT_2Q 0 "register_operand" "=w")
> +     (unspec:VSTRUCT_2Q [
> +       (match_operand:VSTRUCT_2Q 1 "aarch64_simd_struct_operand" "Utv")]
> +       UNSPEC_LD2))]
>    "TARGET_SIMD"
>    "ld2\\t{%S0.<Vtype> - %T0.<Vtype>}, %1"
>    [(set_attr "type" "neon_load2_2reg<q>")]
>  )
>  
> -(define_insn "aarch64_simd_ld2r<mode>"
> -  [(set (match_operand:OI 0 "register_operand" "=w")
> -       (unspec:OI [(match_operand:BLK 1 "aarch64_simd_struct_operand" "Utv")
> -                   (unspec:VALLDIF [(const_int 0)] UNSPEC_VSTRUCTDUMMY) ]
> -                  UNSPEC_LD2_DUP))]
> +(define_insn "aarch64_simd_ld2r<vstruct_elt>"
> +  [(set (match_operand:VSTRUCT_2QD 0 "register_operand" "=w")
> +     (unspec:VSTRUCT_2QD [
> +       (match_operand:VSTRUCT_2QD 1 "aarch64_simd_struct_operand" "Utv")]
> +          UNSPEC_LD2_DUP))]

Sorry again for missing this, but the ld2rs, ld3rs and ld4rs should
keep their BLKmode arguments, since they only access 2, 3 or 4
scalar memory elements.

> @@ -7515,10 +7605,10 @@
>  )
>  
>  (define_insn_and_split "aarch64_combinev16qi"
> -  [(set (match_operand:OI 0 "register_operand" "=w")
> -     (unspec:OI [(match_operand:V16QI 1 "register_operand" "w")
> -                 (match_operand:V16QI 2 "register_operand" "w")]
> -                UNSPEC_CONCAT))]
> +  [(set (match_operand:V2x16QI 0 "register_operand" "=w")
> +     (unspec:V2x16QI [(match_operand:V16QI 1 "register_operand" "w")
> +                      (match_operand:V16QI 2 "register_operand" "w")]
> +                     UNSPEC_CONCAT))]

Just realised that we can now make this a vec_concat, since the
modes are finally self-consistent.

No need to do that though, either way is fine.

Looks good otherwise.

Richard

Reply via email to