Попытался соптимизировать под 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, но оказалось сильно медленнее.








