gpt4 book ai didi

c - 禁用 SSE 的 SSE 寄存器返回

转载 作者:太空狗 更新时间:2023-10-29 16:45:02 41 4
gpt4 key购买 nike

我处于以下情况:

  • 我正在为不允许 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 中传递的返回值的调用。显然,这是行不通的。

如果完全有可能在您的内核中使用 float ,则应该有一个特殊的运行时库来执行不使用通常(用户空间)参数传递和返回约定的软浮点操作。但是,据我所知,BSD 内核中不支持 float 。几年前肯定是这种情况。

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

关于c - 禁用 SSE 的 SSE 寄存器返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1556142/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com