Устанавливаем {$FPUTYPE SSE} и начинаем мучать %-)
пишем такой код:
- Код: Выделить всё
- type
 TVector = record
 x, y, z: single;
 end;
 function le_CrossVector(Vector1, Vector2: TVector): TVector;
 begin
 Result.X := (Vector1.Y * Vector2.Z) - (Vector1.Z * Vector2.Y);
 Result.Y := (Vector1.Z * Vector2.X) - (Vector1.X * Vector2.Z);
 Result.Z := (Vector1.X * Vector2.Y) - (Vector1.Y * Vector2.X);
 end;
компилируем и получаем вот такой код:
- Код: Выделить всё
- .section .text
 .balign 4
 .balign 4
 .globl HEADERS_LE_CROSSVECTOR$TVECTOR$TVECTOR$$TVECTOR
 HEADERS_LE_CROSSVECTOR$TVECTOR$TVECTOR$$TVECTOR:
 pushl %ebp
 movl %esp,%ebp
 subl $36,%esp
 movl %eax,-4(%ebp)
 movl %edx,-8(%ebp)
 movl %ecx,-12(%ebp)
 movl -4(%ebp),%edx
 movl (%edx),%eax
 movl %eax,-24(%ebp)
 movl 4(%edx),%eax
 movl %eax,-20(%ebp)
 movl 8(%edx),%eax
 movl %eax,-16(%ebp)
 movl -8(%ebp),%edx
 movl (%edx),%eax
 movl %eax,-36(%ebp)
 movl 4(%edx),%eax
 movl %eax,-32(%ebp)
 movl 8(%edx),%eax
 movl %eax,-28(%ebp)
 movss -20(%ebp),%xmm1
 mulss -28(%ebp),%xmm1
 movss -16(%ebp),%xmm0
 mulss -32(%ebp),%xmm0
 subss %xmm0,%xmm1
 movl -12(%ebp),%eax
 movss %xmm1,(%eax)
 movss -16(%ebp),%xmm0
 mulss -36(%ebp),%xmm0
 movss -24(%ebp),%xmm1
 mulss -28(%ebp),%xmm1
 subss %xmm1,%xmm0
 movl -12(%ebp),%eax
 movss %xmm0,4(%eax)
 movss -24(%ebp),%xmm0
 mulss -32(%ebp),%xmm0
 movss -20(%ebp),%xmm1
 mulss -36(%ebp),%xmm1
 subss %xmm1,%xmm0
 movl -12(%ebp),%eax
 movss %xmm0,8(%eax)
 leave
 ret
Теперь если посмотреть Зубкова "Ассемблер для DOS, Windows и Unix"
то там мы видим что
movss - переслать одно вещественное число, что как понимаете не есть гуд
Я узнал на другом форуме, что если выровнять тип Tvector, и указать это компилятору, то будет генерироваться команда movaps что уже гораздо быстрее, так как она оперирует уже упакованными числами...
Вопрос: как выровнять данные так, чтобы генерировался более оптимальный SSE код?




