LINUX.ORG.RU

История изменений

Исправление LINUX-ORG-RU, (текущая версия) :

Ну, можно херануть вот так gcc -c ../test.c -O3 -ffast-math -msse -msse2 -msse4 -S -o test.s

#include <stdint.h>

typedef uint64_t vec16 __attribute__ ((vector_size (128)));

vec16 func(vec16 * vars)
{
  return vars[0] * vars[1] * vars[2] * vars[3];
}

И бууубааах :)

	.file	"test.c"
	.text
	.p2align 4
	.globl	func
	.type	func, @function
func:
.LFB0:
	.cfi_startproc
	movdqa	16(%rsi), %xmm3
	movq	%rdi, %rax
	movdqa	144(%rsi), %xmm4
	movdqa	192(%rsi), %xmm7
	movdqa	208(%rsi), %xmm8
	movdqa	%xmm3, %xmm0
	movdqa	%xmm4, %xmm1
	movdqa	%xmm3, %xmm2
	movdqa	224(%rsi), %xmm9
	psrlq	$32, %xmm0
	psrlq	$32, %xmm1
	movdqa	240(%rsi), %xmm10
	movdqa	128(%rsi), %xmm11
	pmuludq	%xmm3, %xmm1
	pmuludq	%xmm4, %xmm0
	pmuludq	%xmm4, %xmm2
	movdqa	272(%rsi), %xmm4
	movdqa	%xmm4, %xmm3
	psrlq	$32, %xmm3
	paddq	%xmm1, %xmm0
	psllq	$32, %xmm0
	paddq	%xmm0, %xmm2
	movdqa	%xmm2, %xmm0
	movdqa	%xmm2, %xmm1
	psrlq	$32, %xmm0
	pmuludq	%xmm3, %xmm2
	movdqa	400(%rsi), %xmm3
	pmuludq	%xmm4, %xmm0
	pmuludq	%xmm4, %xmm1
	movdqa	160(%rsi), %xmm4

...

	movaps	%xmm0, (%rdi)
	movaps	%xmm6, 16(%rdi)
	movaps	%xmm5, 32(%rdi)
	movaps	%xmm4, 48(%rdi)
	movaps	%xmm3, 64(%rdi)
	movaps	%xmm2, 80(%rdi)
	movaps	%xmm1, 96(%rdi)
	movaps	%xmm9, 112(%rdi)
	ret
	.cfi_endproc
.LFE0:
	.size	func, .-func
	.ident	"GCC: (Debian 13.2.0-5) 13.2.0"
	.section	.note.GNU-stack,"",@progbits

Но это получается носом ткнуть, а вот как просто это же код но вот в таком виде


uint64_t func(uint64_t * vars)
{
  return vars[0]  * vars[1]  * vars[2]  * vars[3]  +
         vars[4]  * vars[5]  * vars[6]  * vars[7]  +
         vars[8]  * vars[9]  * vars[10] * vars[11] +
         vars[12] * vars[13] * vars[14] * vars[15] ;
}

Автоматически векторизовать я сам понятия не имею.

Исходная версия LINUX-ORG-RU, :

Ну, можно херануть вот так gcc -c ../test.c -O3 -ffast-math -msse -msse2 -msse4 -S -o test.s

#include <stdint.h>

typedef uint64_t vec16 __attribute__ ((vector_size (128)));

vec16 func(vec16 * vars)
{
  return vars[0] * vars[1] * vars[2] * vars[3];
}

И бууубааах :)

	.file	"test.c"
	.text
	.p2align 4
	.globl	func
	.type	func, @function
func:
.LFB0:
	.cfi_startproc
	movdqa	16(%rsi), %xmm3
	movq	%rdi, %rax
	movdqa	144(%rsi), %xmm4
	movdqa	192(%rsi), %xmm7
	movdqa	208(%rsi), %xmm8
	movdqa	%xmm3, %xmm0
	movdqa	%xmm4, %xmm1
	movdqa	%xmm3, %xmm2
	movdqa	224(%rsi), %xmm9
	psrlq	$32, %xmm0
	psrlq	$32, %xmm1
	movdqa	240(%rsi), %xmm10
	movdqa	128(%rsi), %xmm11
	pmuludq	%xmm3, %xmm1
	pmuludq	%xmm4, %xmm0
	pmuludq	%xmm4, %xmm2
	movdqa	272(%rsi), %xmm4
	movdqa	%xmm4, %xmm3
	psrlq	$32, %xmm3
	paddq	%xmm1, %xmm0
	psllq	$32, %xmm0
	paddq	%xmm0, %xmm2
	movdqa	%xmm2, %xmm0
	movdqa	%xmm2, %xmm1
	psrlq	$32, %xmm0
	pmuludq	%xmm3, %xmm2
	movdqa	400(%rsi), %xmm3
	pmuludq	%xmm4, %xmm0
	pmuludq	%xmm4, %xmm1
	movdqa	160(%rsi), %xmm4

...

	movaps	%xmm0, (%rdi)
	movaps	%xmm6, 16(%rdi)
	movaps	%xmm5, 32(%rdi)
	movaps	%xmm4, 48(%rdi)
	movaps	%xmm3, 64(%rdi)
	movaps	%xmm2, 80(%rdi)
	movaps	%xmm1, 96(%rdi)
	movaps	%xmm9, 112(%rdi)
	ret
	.cfi_endproc
.LFE0:
	.size	func, .-func
	.ident	"GCC: (Debian 13.2.0-5) 13.2.0"
	.section	.note.GNU-stack,"",@progbits

Но это получается носом ткнуть, а вот как просто это же код но вот в таком виде


uint64_t func(uint64_t * vars)
{
  return vars[0]  * vars[1]  * vars[2]  * vars[3]  +
         vars[4]  * vars[5]  * vars[6]  * vars[7]  +
         vars[8]  * vars[9]  * vars[10] * vars[11] +
         vars[12] * vars[13] * vars[14] * vars[15] ;
}

Автоматически векторизовать я сам понятия не имею.