首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用SSE的SSE寄存器返回

禁用SSE的SSE寄存器返回
EN

Stack Overflow用户
提问于 2009-10-12 18:31:17
回答 2查看 14.8K关注 0票数 13

我的情况如下:

  • 我正在为不允许SSE指令的内核编写代码
  • 我需要为x86_64平台

编译浮点算术

下面是一个说明问题的代码示例:

代码语言:javascript
复制
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的相关行:

代码语言:javascript
复制
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

当我运行一个构建时,我会得到以下错误:

代码语言:javascript
复制
SSE register return with SSE disabled

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

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

谢谢内森

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-10-12 19:08:39

听起来,编译器正在发出对库例程的调用,为您执行浮点乘法(大概不使用SSE),但正在尝试对在SSE中传递返回值的调用使用ABI。很明显,这不管用。

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

您可能应该问问BSD内核dev电子邮件列表是否可以使用浮点数;我怀疑它会给您一个比浮点更快、更明确的答案。

票数 9
EN

Stack Overflow用户

发布于 2022-05-20 13:50:02

正如我所知,内核并不经常使用SSE,但是如果体系结构支持SSE,您可以只为模块或应用程序构建打开SSE。

对于我来说,我用:cat /proc/cpuinfo | grep --color -i sse检查了cpu,如果我能看到任何与sse相关的标志或药剂(如果有的话)。如果您得到了任何结果,那么很好,现在您可以看到女巫sse版本是可用的:sse sse2 sse3 sse4

检查后,可以将下列标志添加到Makefile或生成器中,如:

代码语言:javascript
复制
CFLAGS += -msoft-float -msse -msse2 -msse3 -msse4

或者说:

代码语言:javascript
复制
EXTRA_CFLAGS := -msoft-float -msse -msse2 -msse3 -msse4

我在使用Debian的5.5.7版本上使用更新的处理器时遇到了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1556142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档