Я в следующей ситуации:
- Я пишу код для ядра, которое не поддерживает инструкции SSE.
- Мне нужно сделать арифметику с плавающей запятой
- Я компилирую для платформы x86_64
Вот пример кода, иллюстрирующий проблему:
int
main(int argc, char** argv)
{
double d = 0.0, dbase;
uint64_t base_value = 300;
d = (2200.0 - 1000.0)/(1000.0);
dbase = d * base_value;
printf("d = %f, dbase = %f\n", d, dbase);
base_value = dbase;
printf("base_value = %llu\n", (long long unsigned)base_value);
return 0;
}
А вот соответствующая строка из make-файла:
CFLAGS += -mcmodel=kernel -mno-red-zone -mfpmath=387 -mno-sse -mno-sse2 -mno-mmx -mno-3dnow \
-msoft-float -fno-asynchronous-unwind-tables -fno-omit-frame-pointer
Когда я запускаю сборку, я получаю эту ошибку:
SSE register return with SSE disabled
(Ошибка указывает на строку, которая умножает d и base_value)
Любая идея, что я могу сделать, чтобы исправить это? Удаление -mno-sse не вариант, но похоже, что компилятор должен иметь возможность генерировать не-sse код для выполнения умножения.
Спасибо, Натан.
double
в качестве аргумента функции, поскольку вы компилируете соглашение о вызовах, которое передаетdouble
аргументов в регистры XMM. Если вы опуститеprintf("d = %f, dbase = %f\n", d, dbase);
, вы сможете писать функции, использующие FP-математику, даже с-mno-sse
: например. см. godbolt.org/g/oIM1rS для вывода ассемблера из простой функции. - person Peter Cordes   schedule 29.11.2016