Здравствуйте, BulatZiganshin, Вы писали:
_>>Вот как раз такой тупой код в лоб gcc и генерирует:
BZ>ну извини, это называется смотришь в книгу — видишь фигу замени вот это
_>> vpmaskmovd -32(%rdx), %ymm2, %ymm0
_>> vpaddd %ymm0, %ymm1, %ymm1
BZ>на vpaddd -32(%rdx), %ymm1, %ymm1. и это убери
_>> vpandn %ymm3, %ymm2, %ymm2
Для таких очевидных правок не требуется даже в ассемблер лезть — достаточно убрать if из C++ кода. В итоге сгенерируется такое:
.L33:
vmovdqu (%r10,%rax), %ymm0
vpaddd (%r14,%rax), %ymm0, %ymm0
addl $1, %edx
vpaddd 0(%r13,%rax), %ymm0, %ymm0
vpaddd (%r12,%rax), %ymm0, %ymm0
vpaddd 0(%rbp,%rax), %ymm0, %ymm0
vpaddd (%rdi,%rax), %ymm0, %ymm0
vpaddd (%rsi,%rax), %ymm0, %ymm0
vpaddd (%rbx,%rax), %ymm0, %ymm0
vpsrad $3, %ymm0, %ymm0
vmovdqu %ymm0, (%r11,%rax)
addq $32, %rax
cmpl %edx, %ecx
ja .L33
Только вот оно будет всего лишь процентов на 10 быстрее, т.е. данная правка к нашей проблеме отношения не имеет.