我的情况如下:
编译浮点算术
下面是一个说明问题的代码示例:
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代码来执行乘法操作。
谢谢内森
发布于 2009-10-12 19:08:39
听起来,编译器正在发出对库例程的调用,为您执行浮点乘法(大概不使用SSE),但正在尝试对在SSE中传递返回值的调用使用ABI。很明显,这不管用。
如果在内核中完全可以使用浮点,那么应该有一个特殊的运行时库来执行不使用通常(userland)参数传递和返回约定的软浮点操作。然而,据我所知,在BSD内核中不支持浮点。几年前的情况确实如此。
您可能应该问问BSD内核dev电子邮件列表是否可以使用浮点数;我怀疑它会给您一个比浮点更快、更明确的答案。
发布于 2022-05-20 13:50:02
正如我所知,内核并不经常使用SSE,但是如果体系结构支持SSE,您可以只为模块或应用程序构建打开SSE。
对于我来说,我用:cat /proc/cpuinfo | grep --color -i sse检查了cpu,如果我能看到任何与sse相关的标志或药剂(如果有的话)。如果您得到了任何结果,那么很好,现在您可以看到女巫sse版本是可用的:sse sse2 sse3 sse4。
检查后,可以将下列标志添加到Makefile或生成器中,如:
CFLAGS += -msoft-float -msse -msse2 -msse3 -msse4或者说:
EXTRA_CFLAGS := -msoft-float -msse -msse2 -msse3 -msse4我在使用Debian的5.5.7版本上使用更新的处理器时遇到了这个问题。
https://stackoverflow.com/questions/1556142
复制相似问题