Linux内核模块中x87内联汇编中的 *** 作数类型不匹配

Linux内核模块中x87内联汇编中的 *** 作数类型不匹配,第1张

概述我真的想在 Linux内核模块中使用浮点运算,只是为了它.我不想做任何花哨的事情,只需使用x87 trig指令和/或sqrt指令,然后将结果赋值给变量.就是这样.到目前为止,我已经尝试过: float sqroot(float arg){ float returnValue; asm( "fld %1\n" "fsqrt\n" "fst %0" 我真的想在 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'

任何和所有帮助将不胜感激.

@H_419_22@解决方法 使用内核模块中的x87将“正常工作”,但会静默破坏用户空间x87 / MMX状态. Why am I able to perform floating point operations inside a Linux kernel module?

你需要kernel_fpu_begin()/ kernel_fpu_end()来保证安全.

而不是从内联asm加载/存储,请求输入并在x87寄存器堆栈的顶部生成输出,并让编译器在需要时发出加载/存储指令.编译器已经知道如何做到这一点,你只需要为sqrt指令本身使用内联asm,你可以用这种方式向编译器描述:

static inlinefloat sqroot(float arg) {    asm("fsqrt"  : "+t"(arg) );    return arg;}

(有关此on the Godbolt compiler explorer,请参阅编译器生成的asm)

寄存器约束必须告诉块使用浮点寄存器.

或者完全避免内联asm,使用可以内联的GNU C内置函数

您需要使用-fno-math-errno将内置实际内联为fsqrt或sqrtss,而不使用回退来调用sqrtf以获取将导致NaN的输入.

static inlinefloat sqroot_builtin(float arg) {    return __builtin_sqrtf(arg);}

对于x86-64,我们得到sqrtss%xmm0,%xmm0 / ret,而对于i386,我们得到fld / fsqrt / ret. (参见上面的Godbolt链接).恒定传播通过__builtin_sqrt和其他优化工作.

编辑:纳入@ iwillnotexist-IDontexist的观点(重新加载).

另外,如果是我,我会在声明中添加静态内联并将其放在头文件中.这将允许编译器更智能地管理寄存器并避免堆栈帧开销.

(我也很想将float改为double.否则,你将丢弃实际浮点指令中使用的额外精度.虽然如果你最终经常将值存储为float,那么将会有一个额外的cvtpd2ps指令.OTOH,如果你将参数传递给printf,例如,这实际上避免了cvtps2pd.)

但linux内核kprintf无论如何都没有double的转换.

如果使用-mfpmath = 387(32位代码的默认值)进行编译,则内联后值将保留在80位x87寄存器中.但是,对于使用64位默认值-mfpmath = sse的64位代码,这将导致在加载回XMM寄存器时舍入为浮点数.

kernel_fpu_begin()保存完整的FPU状态,并且避免使用SSE寄存器,只使用x87不会使它或最终的FPU恢复时更便宜地返回用户空间.

总结

以上是内存溢出为你收集整理的Linux内核模块中x87内联汇编中的 *** 作数类型不匹配全部内容,希望文章能够帮你解决Linux内核模块中x87内联汇编中的 *** 作数类型不匹配所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1019828.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存