История изменений
Исправление 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] ;
}
Автоматически векторизовать я сам понятия не имею.