On Sat, Jan 04, 2014 at 09:46:32AM +0100, Uros Bizjak wrote: > Taking into account Kirill's comment, the patch is OK, although I find
Thanks. > a bit strange in [1] that > > void f2 (int *__restrict e, int *__restrict f) { int i; for (i = 0; i > < 1024; i++) e[i] = f[i]; } > > results in > > vmovdqu64 (%rsi,%rax), %zmm0 > vmovdqu32 %zmm0, (%rdi,%rax) > > Shouldn't these two move insns be the same? Right now *mov<mode>_internal doesn't care which of the vmovdqa{32,64} (and vmovdqu{32,64}) it uses, we could do something like following. We still have a problem that there is no vmovdq[ua]{8,16}, so we need to pick one of {32,64} for it. Also, there is case MODE_OI: case MODE_TI: return "vmovdqa64\t{%g1, %g0|%g0, %g1}"; a few lines above, if we wanted to make the output look "nicer", we could also use vmovdqa64 there only for V{2,4}DImode and use vmovdqa32 for other modes. Note I haven't tested the patch at all, perhaps some testcases wouldn't match their regexps anymore (but probably the gcc.target/i386/avx512f-vmovdqu32-1.c change could go away). --- gcc/config/i386/sse.md.jj 2014-01-04 09:48:48.000000000 +0100 +++ gcc/config/i386/sse.md 2014-01-04 10:03:30.256458372 +0100 @@ -743,9 +743,16 @@ (define_insn "*mov<mode>_internal" case MODE_XI: if (misaligned_operand (operands[0], <MODE>mode) || misaligned_operand (operands[1], <MODE>mode)) - return "vmovdqu64\t{%1, %0|%0, %1}"; - else + { + if (<MODE>mode == V8DImode) + return "vmovdqu64\t{%1, %0|%0, %1}"; + else + return "vmovdqu32\t{%1, %0|%0, %1}"; + } + else if (<MODE>mode == V8DImode) return "vmovdqa64\t{%1, %0|%0, %1}"; + else + return "vmovdqa32\t{%1, %0|%0, %1}"; default: gcc_unreachable (); > > [1] http://gcc.gnu.org/ml/gcc/2014-01/msg00015.html > > Thanks, > Uros. Jakub