Причина сбоя кода не в массивах, а в том, как работают команды fld и fst.Это код, который вы хотите:
float tmp;
__asm__ ( "flds %1; fld %%st(0); fmulp; " : "=t" (tmp) : "m" (x[0]) );
__asm__ ( "flds %1; fadds %2;" : "=t" (A[0]) : "m" (A[0]), "m" (tmp) );
fld
и fst
инструкции нуждаются в операнде памяти.Также вам необходимо указать, хотите ли вы загружать float (flds), double (fldl) или long double (fldt).Что касается выходных операндов, я просто использую ограничение =t
, которое просто сообщает компилятору, что результат находится на вершине стека регистров, то есть ST (0).
У арифметических операций либо нет операндов(fmulp) или один операнд памяти (но затем вам нужно снова указать размер, fmuls, fadds и т. д.).
Подробнее о встроенном ассемблере , GNU Assembler в целом и см. Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32 .
Конечно, лучше всего избавиться от временной переменной:
__asm__ ( "flds %1; fld %%st(0); fmulp; fadds %2;" : "=t" (A[0]) : "m" (x[0]), "m" (A[0]));
Хотя, если вы хотите повысить производительность, вам не нужно использовать ассемблер.GCC полностью способен производить этот код.Но вы можете рассмотреть возможность использования векторных инструкций SSE и других простых методов оптимизации, таких как разрыв цепочек зависимостей в вычислениях, см. Руководства по оптимизации Agner Fog