2009-10-12 3 views
9

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

  • Я пишу код для ядра, что не позволяет инструкциям Стокгольмской Школы
  • мне нужно сделать, арифметика с плавающей точкой
  • I «м компиляции для 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; 
} 

А вот соответствующая строка из Makefile:

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 

(точки ошибок в линии, которая умножает д и base_value)

Любая идея, что я могу сделать, чтобы исправить это? Удаление -mno-sse не является вариантом, но похоже, что компилятор должен иметь возможность генерировать не-sse-код для умножения.

Благодаря Натан

+1

Возможно, что gcc не может справиться с этим случаем, поскольку предполагает, что все процессоры x86-64 имеют SSE. – Amok

+1

Означает ли это, что никто никогда не умножает ничего внутри ядра FreeBSD на 64-битных сборках? – Nathan

+0

Любое ядро, с которым я работал, имеет тенденцию избегать плавающей запятой как можно больше. –

ответ

6

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

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

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

+0

Я решил просто использовать арифметику с фиксированной точкой (ядро, о котором идет речь, основано на ядре FreeBSD, но значительно изменено, поэтому я не был уверен, что любой из официальных списков рассылки даст лучший ответ, чем «не сделайте это ». – Nathan

+0

А вот извините, что для этого нет более счастливого ответа. –