【发布时间】:2016-05-18 17:48:23
【问题描述】:
我真的很想在 Linux 内核模块中使用浮点运算,只是为了它。我不想做任何花哨的事情,只需使用 x87 trig 指令和/或 sqrt 指令,然后将结果分配给变量。就是这样。到目前为止,我已经尝试过:
float sqroot(float arg){
float returnValue;
asm(
"fld %1\n"
"fsqrt\n"
"fst %0"
:"=r"(returnValue)
: "r"(arg)
);
return returnValue;
}
这非常失败并产生以下错误:
Error: operand type mismatch for `fld'
Error: operand type mismatch for `fst'
我们将不胜感激。
【问题讨论】:
-
哇哇哇?这不是推荐问题,只是标题不好。投票重新开放。
-
标题已经过编辑,以更接近问题的内容,而不是简单的教程推荐。
-
同意。这是一个合法的问题。
-
您的输出
=r和输入r约束当前指示使用通用整数寄存器作为fld和fst的参数。我认为您可能需要将其更改为两个输入m(内存)约束。 -
旁注:当您在内核中执行浮点运算时,您必须特别注意保存/恢复 FP 环境,以防止上下文切换弄乱用户空间应用程序。有特殊的内核调用可以做到这一点[或者你禁用中断等并手动保存/恢复]
标签: c linux-kernel kernel inline-assembly x87