SSE寄存器回用SSE禁用(SSE register return with SSE disable

2019-07-22 12:29发布

我在以下情况:

  • 我是一个内核不允许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;
}

这里是从生成文件中的相关行:

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代码做乘法。

由于弥敦道

Answer 1:

这听起来像编译器发出调用一个库子程序来完成浮点乘法你(可能不使用SSE),但尝试使用ABI对已通过上交所返回值的调用。 显然,这是行不通的。

如果有可能,在所有的内核都使用浮点,应该有一个特殊的运行时库做不使用通常的(用户态)的参数传递和返回公约软浮点运算。 然而,据我所知,目前在BSD内核浮点的支持。 这是肯定的情况在几年前。

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



文章来源: SSE register return with SSE disabled