auto-vectorization on floats

http://sourceforge.jp/magazine/10/11/26/0710258 を見て.
gcc の場合は -ffast-math を渡してやる必要があったような,と思って調べてみた.
http://gcc.gnu.org/projects/tree-ssa/vectorization.html
ここによると -fassociative-math を渡してやる必要があるっぽい.
-fassociative-math を有効にするには,同時に -fno-signed-zeros と -fno-trapping-math が有効になっている必要がある.
これらのフラグは -funsafe-math-optimizations に含まれており,さらにこれは -ffast-math に含まれている.


以下 gcc-4.5.1 でフラグを変えつつ試してみた結果.
gcc -O3

	xorps	%xmm1, %xmm1
	leaq	512(%rsp), %rcx
	xorl	%eax, %eax
	movq	%rsp, %rdx
	.p2align 4,,10
	.p2align 3
.L2:
	movss	(%rcx,%rax), %xmm0
	mulss	(%rdx,%rax), %xmm0
	addq	$4, %rax
	cmpq	$512, %rax
	addss	%xmm0, %xmm1
	jne	.L2
	unpcklps	%xmm1, %xmm1
	movl	$.LC1, %edi
	movl	$1, %eax
	cvtps2pd	%xmm1, %xmm0
	call	printf

gcc -O3 -ffast-math

	xorps	%xmm1, %xmm1
	leaq	512(%rsp), %rdx
	xorl	%eax, %eax
	movq	%rsp, %rcx
	.p2align 4,,10
	.p2align 3
.L2:
	movaps	(%rcx,%rax), %xmm0
	mulps	(%rdx,%rax), %xmm0
	addq	$16, %rax
	cmpq	$512, %rax
	addps	%xmm0, %xmm1
	jne	.L2
	movaps	%xmm1, %xmm0
	movl	$.LC0, %edi
	movl	$1, %eax
	movhlps	%xmm1, %xmm0
	addps	%xmm1, %xmm0
	movaps	%xmm0, %xmm1
	shufps	$85, %xmm0, %xmm1
	addps	%xmm0, %xmm1
	movaps	%xmm1, %xmm0
	unpcklps	%xmm0, %xmm0
	cvtps2pd	%xmm0, %xmm0
	call	printf

更にループアンローリングを有効にすると記事のリスト2に近いコードになった.
gcc -O3 -ffast-math -funroll-loops

	xorps	%xmm0, %xmm0
	leaq	512(%rsp), %rdx
	xorl	%eax, %eax
	movq	%rsp, %rcx
	.p2align 4,,10
	.p2align 3
.L2:
	movaps	(%rcx,%rax), %xmm8
	mulps	(%rdx,%rax), %xmm8
	movaps	16(%rcx,%rax), %xmm7
	mulps	16(%rdx,%rax), %xmm7
	movaps	32(%rcx,%rax), %xmm6
	mulps	32(%rdx,%rax), %xmm6
	addps	%xmm8, %xmm0
	movaps	48(%rcx,%rax), %xmm5
	mulps	48(%rdx,%rax), %xmm5
	movaps	64(%rcx,%rax), %xmm4
	addps	%xmm7, %xmm0
	mulps	64(%rdx,%rax), %xmm4
	movaps	80(%rcx,%rax), %xmm3
	mulps	80(%rdx,%rax), %xmm3
	addps	%xmm6, %xmm0
	movaps	96(%rcx,%rax), %xmm2
	mulps	96(%rdx,%rax), %xmm2
	movaps	112(%rcx,%rax), %xmm1
	addps	%xmm5, %xmm0
	mulps	112(%rdx,%rax), %xmm1
	subq	$-128, %rax
	cmpq	$512, %rax
	addps	%xmm4, %xmm0
	addps	%xmm3, %xmm0
	addps	%xmm2, %xmm0
	addps	%xmm1, %xmm0
	jne	.L2
	movaps	%xmm0, %xmm9
	movl	$.LC0, %edi
	movl	$1, %eax
	movhlps	%xmm0, %xmm9
	addps	%xmm0, %xmm9
	movaps	%xmm9, %xmm0
	shufps	$85, %xmm9, %xmm0
	addps	%xmm9, %xmm0
	unpcklps	%xmm0, %xmm0
	cvtps2pd	%xmm0, %xmm0
	call	printf