[PATCH i386 1/8] [AVX512] Adjust register classes.

Richard Henderson rth@redhat.com
Wed Aug 21 20:08:00 GMT 2013


On 08/21/2013 11:28 AM, Kirill Yukhin wrote:
>>> +	  && (mode == XImode
>>> +	      || VALID_AVX512F_REG_MODE (mode)
>>> +	      || VALID_AVX512F_SCALAR_MODE (mode)))
>>> +	return true;
>>> +
>>> +      /* In xmm16-xmm31 we can store only 512 bit modes.  */
>>> +      if (EXT_REX_SSE_REGNO_P (regno))
>>> +	return false;
>>
>> You're rejecting scalar modes here.  Not what you wanted, surely.
> Actually, I believe comment for AVX-512 part is confusing.
> We're not rejecting scalar modes, VALID_AVX512F_SCALAR_MODE allows that.
> We are rejecting all extra SSE registers, when there is no AVX-512 or
> mode is not fit for it.

Yes, I did mis-read the test.  What you have now is correct, but
I still think it could be improved.  We'll do that with followups.

>  (define_insn "*movdi_internal"
>    [(set (match_operand:DI 0 "nonimmediate_operand"
> -    "=r  ,o  ,r,r  ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*x,*x,*x,m ,?r ,?r,?*Yi,?*Ym,?*Yi")
> +    "=r  ,o  ,r,r  ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,?r ,?r,?*Yi,?*Ym,?*Yi")
>  	(match_operand:DI 1 "general_operand"
> -    "riFo,riF,Z,rem,i,re,C ,*y,m  ,*y,*Yn,r   ,C ,*x,m ,*x,*Yj,*x,r   ,*Yj ,*Yn"))]
> +    "riFo,riF,Z,rem,i,re,C ,*y,m  ,*y,*Yn,r   ,C ,*v,m ,*v,*Yj,*v,r   ,*Yj ,*Yn"))]
>    "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
>  {
>    switch (get_attr_type (insn))
> @@ -1896,6 +1964,8 @@
>  	  return "%vmovq\t{%1, %0|%0, %1}";
>  	case MODE_TI:
>  	  return "%vmovdqa\t{%1, %0|%0, %1}";
> +	case MODE_XI:
> +	  return "vmovdqa64\t{%g1, %g0|%g0, %g1}";
>  
>  	case MODE_V2SF:
>  	  gcc_assert (!TARGET_AVX);
> @@ -1989,7 +2059,11 @@
>       (cond [(eq_attr "alternative" "2")
>  	      (const_string "SI")
>  	    (eq_attr "alternative" "12,13")
> -	      (cond [(ior (not (match_test "TARGET_SSE2"))
> +	      (cond [(ior (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[0]))")
> +			  (and (match_test "REG_P (operands[1])")
> +			       (match_test "EXT_REX_SSE_REGNO_P (REGNO (operands[1]))")))
> +		       (const_string "XI")
> +		     (ior (not (match_test "TARGET_SSE2"))
>  			  (match_test "TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL"))
>  		       (const_string "V4SF")
>  		     (match_test "TARGET_AVX")

Better.  And while it produces the correct results, using match_operand would
be better than embedding a reference to operands within a match_test.

But since I don't want to see another 2000 line patch, I'd like you to address
this with a followup as well.

The patch is ok to commit.


r~



More information about the Gcc-patches mailing list