On the x86_64, does one have to zero a vector register before filling it completely ?

Toon Moene toon@moene.org
Sat Nov 28 13:47:00 GMT 2009


H.J. Lu wrote:
> On Sat, Nov 28, 2009 at 3:21 AM, Toon Moene <toon@moene.org> wrote:
>> L.S.,
>>
>> Due to the discussion on register allocation, I went back to a hobby of
>> mine: Studying the assembly output of the compiler.
>>
>> For this Fortran subroutine (note: unless otherwise told to the Fortran
>> front end, reals are 32 bit floating point numbers):
>>
>>      subroutine sum(a, b, c, n)
>>      integer i, n
>>      real a(n), b(n), c(n)
>>      do i = 1, n
>>         c(i) = a(i) + b(i)
>>      enddo
>>      end
>>
>> with -O3 -S (GCC: (GNU) 4.5.0 20091123), I get this (vectorized) loop:
>>
>>        xorps   %xmm2, %xmm2
>>        ....
>> .L6:
>>        movaps  %xmm2, %xmm0
>>        movaps  %xmm2, %xmm1
>>        movlps  (%r9,%rax), %xmm0
>>        movlps  (%r8,%rax), %xmm1
>>        movhps  8(%r9,%rax), %xmm0
>>        movhps  8(%r8,%rax), %xmm1
>>        incl    %ecx
>>        addps   %xmm1, %xmm0
>>        movaps  %xmm0, 0(%rbp,%rax)
>>        addq    $16, %rax
>>        cmpl    %ebx, %ecx
>>        jb      .L6
>>
>> I'm not a master of x86_64 assembly, but this strongly looks like %xmm{0,1}
>> have to be zero'd (%xmm2 is set to zero by xor'ing it with itself), before
>> they are completely filled with the mov{l,h}ps instructions ?
>>
> 
> I think it is used to avoid partial SSE register stall.
> 
> 
You mean there's no movaps (%r9,%rax), %xmm0 (and mutatis mutandis for 
%xmm1) instruction (to copy 4*32 bits to the register) ?

-- 
Toon Moene - e-mail: toon@moene.org - phone: +31 346 214290
Saturnushof 14, 3738 XG  Maartensdijk, The Netherlands
At home: http://moene.org/~toon/
Progress of GNU Fortran: http://gcc.gnu.org/gcc-4.5/changes.html



More information about the Gcc mailing list