Я пишу программу на C, которая должна выполнять быстрые математические вычисления. Я использую встроенные инструкции по сборке SSE, чтобы получить действие SIMD (используя упакованные числа с плавающей запятой двойной точности). Я компилирую с помощью GCC в Linux.
Я нахожусь в ситуации, когда мне нужно перебрать некоторые данные, и я использую постоянный коэффициент в своих вычислениях. Я хотел бы сохранить этот фактор в безопасном регистре во время цикла, чтобы мне не приходилось перезагружать его каждый раз.
Чтобы уточнить с помощью некоторого кода:
struct vect2 {
fltpt x;
fltpt y;
}__attribute__((aligned(16))); /* Align on 16B boundary for SSE2 instructions */
typedef struct vect2 vect2_t;
void function()
{
/* get a specific value set up in xmm1, and keep it there for the
* rest of the loop. */
for( int i = 0, i<N; i++ ){
asm(
"Some calculations;"
"on an element of;"
"a data set.;"
"The value in xmm1;"
"is needed;"
);
}
}
Я пытался что-то сделать с ключевым словом "register". Но если я не ошибаюсь, похоже, что я могу сохранить только указатель на эту структуру (в общем регистре). Это должно быть защищено на каждой итерации, тратя драгоценное время.
register vect2_t hVect asm("xmm1") = {h, h};
/* Gives error: data type of 'hVect' isn't suitable for a register */
register vect2_t *hVect2 asm("rax");
*hVect2 = (vect2_t){h,h};
/* Seems to work, but not what I'm looking for */
Я не просто хочу предположить, что GCC не изменит регистр xmm1, это слишком много "демонов, вылетающих из носа" :-). Поэтому я надеюсь, что есть правильный способ сделать это.