SSE регистрация возврата с отключенным SSE - PullRequest
11 голосов
/ 12 октября 2009

Я нахожусь в следующей ситуации:

  • Я пишу код для ядра, которое не разрешает инструкции 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 не вариант, но кажется, что компилятор должен быть способен генерировать несексе-код для умножения.

Спасибо Nathan

1 Ответ

7 голосов
/ 12 октября 2009

Похоже, что компилятор отправляет вызов библиотечной подпрограмме, чтобы сделать умножение с плавающей запятой для вас (предположительно, без использования SSE), но пытается использовать ABI для вызова, в котором возвращаемое значение передается в SSE. Очевидно, что это не работает.

Если вообще возможно использовать плавающую точку в вашем ядре, должна быть специальная библиотека времени выполнения для операций мягкого плавания, которая не использует обычные (пользовательские) соглашения о передаче аргументов и возвращении. Однако, насколько я знаю, в ядре BSD нет поддержки с плавающей точкой. Это, конечно, имело место несколько лет назад.

Возможно, вам следует просто спросить список рассылки разработчиков ядра BSD, можно ли использовать плавающую точку; Я подозреваю, что это даст вам более быстрый и точный ответ, чем SO.

...