我处于以下情况:
- 我正在为不允许 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 中传递返回值的调用。显然,这是行不通的。
如果可以在内核中使用浮点,则应该有一个特殊的运行时库来执行软浮点操作,该操作不使用通常的(用户态)参数传递和返回约定。然而,据我所知,BSD内核中不支持浮点。几年前确实是这样。
您可能应该询问 BSD 内核开发电子邮件列表是否可以使用浮点;我怀疑它会给你一个比 SO 更快更明确的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)