- Код: Выделить всё
Type
PComplex =^TComplex;
TComplex = record
Re,
Im:Double;
end;// TComplex = record
Написал реализацию БПФ на Языки Free Pascal, на встроенном ассемблере (FPU), теперь хочу написать применив SSE. В данном случае SSE2.
Вот кусочек кода:
- Код: Выделить всё
MOVuPD xmm0, [EAX] //ST(0) := D[StartIndex]
MOVuPD xmm1, xmm0
MOVuPD xmm2, [EBX]
ADDPD xmm0, xmm2
SUBPD xmm1, xmm2
MOVuPD [EAX], xmm0
MOVuPD [EBX], xmm1
pop EDX
jmp @Exit
Все работает на ура. Но в большинстве случаев встречал такую запись (особенно в книгах) да и в спецификации команд указано, что так можно делать. А именно:
- Код: Выделить всё
SUBPD xmm1, указатель на память
Переделываем:
- Код: Выделить всё
MOVuPD xmm0, [EAX] //ST(0) := D[StartIndex]
MOVuPD xmm1, xmm0
MOVuPD xmm2, [EBX]
ADDPD xmm0, xmm2
SUBPD xmm1, TComplex [EBX] --- Тут ошибка
MOVuPD [EAX], xmm0
MOVuPD [EBX], xmm1
pop EDX
jmp @Exit
Пробывал вот так:
- Код: Выделить всё
SUBPD xmm1, TComplex [EBX]
или
SUBPD xmm1, dqword [EBX]
или
SUBPD xmm1, [EBX]
Но у меня вылетает ошибка: SIGSEGV почему, что я делаю не так?.
И да чуть не забыл, если кто подскажет, наверное сможет мне ответить, как лучше делать? непосредственно обращаться к памяти? вот так:
- Код: Выделить всё
SUBPD xmm1, [EBX]
Или всеже загрузить в регистр а потом отнять? разница по времени ощутимая будет?
PS. Работаю с SSE впервые.