Попытался соптимизировать под SSE4/4.1/4.2 функцию вычисления скалярного произведения двух векторов 32-битных чисел с плавающей точкой. Длина векторов фиксирована - 28 чисел (=28*4=112 байт). %rsi указывает на первый вектор (загружается в %xmm1-7), %rdi - на второй, результат в %xmm0.
0: 66 0f ef c0 pxor %xmm0,%xmm0
4: 0f 10 0e movups (%rsi),%xmm1
7: 0f 10 56 10 movups 0x10(%rsi),%xmm2
b: 0f 10 5e 20 movups 0x20(%rsi),%xmm3
f: 0f 10 66 30 movups 0x30(%rsi),%xmm4
13: 0f 10 6e 40 movups 0x40(%rsi),%xmm5
17: 0f 10 76 50 movups 0x50(%rsi),%xmm6
1b: 0f 10 7e 60 movups 0x60(%rsi),%xmm7
1f: 0f 59 0f mulps (%rdi),%xmm1
22: 0f 59 57 10 mulps 0x10(%rdi),%xmm2
26: 0f 59 5f 20 mulps 0x20(%rdi),%xmm3
2a: 0f 59 67 30 mulps 0x30(%rdi),%xmm4
2e: 0f 59 6f 40 mulps 0x40(%rdi),%xmm5
32: 0f 59 77 50 mulps 0x50(%rdi),%xmm6
36: 0f 59 7f 60 mulps 0x60(%rdi),%xmm7
3a: 0f 58 d1 addps %xmm1,%xmm2
3d: 0f 58 e3 addps %xmm3,%xmm4
40: 0f 58 f5 addps %xmm5,%xmm6
43: 0f 58 c7 addps %xmm7,%xmm0
46: 0f 58 e2 addps %xmm2,%xmm4
49: 0f 58 c6 addps %xmm6,%xmm0
4c: 0f 58 c4 addps %xmm4,%xmm0
4f: f2 0f 7c c0 haddps %xmm0,%xmm0
53: f2 0f 7c c0 haddps %xmm0,%xmm0
Кое-какой выигрыш получил, но хочется больше. Что тут можно ещё оптимизировать? Что-то по-другому сделать? Попробовал также на AVX, но оказалось сильно медленнее.