On Thu, Oct 09, 2014 at 04:13:25PM +0400, Kirill Yukhin wrote:
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -39791,6 +39791,8 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, enum 
> machine_mode mode,
>      case V8SFmode:
>      case V8SImode:
>      case V2DFmode:
> +    case V64QImode:
> +    case V32HImode:
>      case V2DImode:
>      case V4SFmode:
>      case V4SImode:
> @@ -39821,6 +39823,9 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, enum 
> machine_mode mode,
>        goto widen;
>  
>      case V8HImode:
> +      if (TARGET_AVX512VL)
> +        return ix86_vector_duplicate_value (mode, target, val);
> +

Shouldn't that be TARGET_AVX512VL && TARGET_AVX512BW ?

>        if (TARGET_SSE2)
>       {
>         struct expand_vec_perm_d dperm;
> @@ -39851,6 +39856,9 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, enum 
> machine_mode mode,
>        goto widen;
>  
>      case V16QImode:
> +      if (TARGET_AVX512VL)
> +        return ix86_vector_duplicate_value (mode, target, val);
> +

Ditto.

>        if (TARGET_SSE2)
>       goto permute;
>        goto widen;
> @@ -39880,16 +39888,19 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, 
> enum machine_mode mode,
>  
>      case V16HImode:
>      case V32QImode:
> -      {
> -     enum machine_mode hvmode = (mode == V16HImode ? V8HImode : V16QImode);
> -     rtx x = gen_reg_rtx (hvmode);
> +      if (TARGET_AVX512VL)
> +        return ix86_vector_duplicate_value (mode, target, val);

Ditto.

> @@ -40503,6 +40515,42 @@ half:
>                             gen_rtx_VEC_CONCAT (mode, op0, op1)));
>        return;
>  
> +    case V64QImode:
> +      quarter_mode = V16QImode;
> +      half_mode = V32QImode;
> +      goto quarter;
> +
> +    case V32HImode:
> +      quarter_mode = V8HImode;
> +      half_mode = V16HImode;
> +      goto quarter;

I wonder whether for these modes it can ever be beneficial to build them
through interleaves/concatenations etc., if it wouldn't be better to build
them by storing all values into memory and just reading it back.

> -(define_mode_iterator VI48F_512 [V16SI V16SF V8DI V8DF])
> +(define_mode_iterator VI48F_I12_AVX512BW
> +  [V16SI V16SF V8DI V8DF
> +  (V32HI "TARGET_AVX512BW") (V64QI "TARGET_AVX512BW")])

What does the I12 stand for?  Wasn't it meant to be VI48F_512_AVX512BW
or I512?

>  (define_mode_iterator VI48F
>    [V16SI V16SF V8DI V8DF
>     (V8SI "TARGET_AVX512VL") (V8SF "TARGET_AVX512VL")
> @@ -17472,7 +17474,7 @@
>  })
>  
>  (define_expand "vec_init<mode>"
> -  [(match_operand:VI48F_512 0 "register_operand")
> +  [(match_operand:VI48F_I12_AVX512BW 0 "register_operand")
>     (match_operand 1)]
>    "TARGET_AVX512F"
>  {

        Jakub

Reply via email to