SSE寄存器返回SSE禁用

我遇到以下情况:

  • 我正在为不允许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; } 

这是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 

(错误指向乘以d和base_value的行)

知道我能做些什么来解决这个问题吗? 删除-mno-sse不是一个选项,但似乎编译器应该能够生成非sse代码来进行乘法运算。

谢谢内森

听起来好像编译器正在发出对库例程的调用来为您做浮点乘法(可能不使用SSE),但是尝试将ABI用于在SSE中传递返回值的调用。 显然,这不起作用。

如果你的内核完全可以使用浮点,那么应该有一个特殊的运行时库来进行软浮动操作,它不使用通常的(userland)参数传递和返回约定。 但是,据我所知,BSD内核中不支持浮点。 几年前的情况确实如此。

您应该只询问BSD内核开发电子邮件列表是否可以使用浮点数; 我怀疑它会给你一个比SO更快更确定的答案。