Я пишу программу на C, которая должна выполнять быстрые математические вычисления. Я использую встроенные инструкции по сборке SSE для получения некоторого действия SIMD (с использованием чисел с плавающей запятой с двойной точностью). Я компилирую GCC в Linux.Получите GCC, чтобы сохранить регистр SSE во всей функции, которая использует inline asm
Я в ситуации, когда мне нужно перебрать некоторые данные, и я использую постоянный множитель в своих расчетах. Я бы хотел сохранить этот фактор в безопасном регистре во время цикла, поэтому мне не нужно его повторно загружать каждый раз.
Чтобы уточнить с каким-то кодом:
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 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 регистр, это слишком много «демонов, вылетающие из своего носа» рода вещи :-). Поэтому я надеюсь, что есть правильный способ сделать это.