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~