Дело в выравнивании… если скажем остановится только на SSE командах… каким бы образом мы не компилировали (с вкл отладчиком, разными оптимизациями) exe файл сам по себе не работает, вылетает ошибка. Если же мы запустим эту программку под gdb вот так:

Видно собственно виновника, первая команда требующая выравнивания… Оно вроде и понятно.
Но вот вам Магия:Если поставить оптимизацию О1, Но выключить Дебаггер, и скомпилить и запустить программу в среде Lazarus, программа отрабатывает на ура…, если же запустить программу вне Ide ошибка.
Смешно конечно, но проблема в выравнивании, но как сказать FPC выравнивать на 16 байт я не знаю…
Если обратится к таким директивам как:
- Код: Выделить всё
{$codealign VARMIN=16}
{$codealign VARMAX=16}
{$codealign LOCALMIN=16}
{$codealign LOCALMAX=16}
{$codealign PROC=16}
{$codealign JUMP=16}
{$codealign LOOP=16}
{$codealign CONSTMIN=16}
{$codealign CONSTMAX=16}
{$codealign RECORDMIN=16}
{$codealign RECORDMAX=16}
{$codealign 16}
{$align 16}
Они ничего не исправили. Возможно некоторые статические константы или чень еще стали выровнены, а вот элементы динамического массива (комплексные числа) размером по 8 или 16 байт нет не стали.

Вследствие чего мы видим ошибку.
Оно и понятно, по идее нам нужно
- Код: Выделить всё
{$A16}
Ну это я так думаю… но есть только
- Код: Выделить всё
{$A8}
Так что если Вы знаете как задать компилятору выравнивание не на 8 а на 16 байт будет очень кстати.
Вот наиболее близкие темы из БагТрекера:
http://bugs.freepascal.org/view.php?id=8986написано мол если пересобрать FPC с параметром
- Код: Выделить всё
make all FPC=ppcx64-2.1.5 OPT="-O-"
то мол все будет работать… но меня смущает 64.. и что это за –О- где про него написано…. Что он делает.
Ну у меня винда 32 битная и собирал я просто дав команду:
- Код: Выделить всё
make all OPT="-O-"
Не знаю, но все собралось хорошо. После чего дал команду:
ZipInstall получил архив с FPC 2.5.1.
Сделал как написано тут:
Как подключить к Lazarus новую версию компилятора FPCПосле чего пересобрал Лазарус.. в About красуется надпись FPC 2.5.1

Простая форма компилируется. и работает. Но у меня в коде есть такая вот процедура:
- Код: Выделить всё
procedure _fft(var D:TCmxArray; StartIndex,ALen:Integer;
const TableExp:TCmxArray); register; assembler;
{$ASMMODE intel}
asm
// много кода
//-------вызов функции FFT2(D,StartIndex,ALen,TableExp) ----- begin --------
shr ECX,1 //ALen:=ALen shr 1;
push TableExp
call _fft //Вызываем _fft = Рекурсия БПФ,
//для первой половины данных
//-------вызов функции FFT2(D,StartIndex,ALen,TableExp) ----- End ----------
Так вот на строчке:
- Код: Выделить всё
push TableExp
Лазарус стал ругуаться так:
recursive_fft.pas(251,11) Error: Asm: 64 Bit operands not supported
вообще-то ошибка когда в функции\процедуре используется набор команд SSE когда все тоже самое, но команды заменены на SSE2, то все компилируется и ошибки нет.
в БагТрекере это похоже на вот эту ошибку:
Internal assembler doesn't support movd with xmm registers in 32-bit modeможет это таже самая ошибка? просто что-то сломали?
Так что вопросы такие:Что это за мифический параметр OPT="-O-" и работает ли он для 32 бит. ?
Если работает и именно он включает возможность выравнивания на 16 байт, то что за ошибка? если зайти в IDE FPC то в About написано что i386... а тут он расценил как 64 битную операцию
