Устанавливаем {$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 код?