如何让这个sqrt内联程序集在iOS上工作

我正在尝试遵循另一个SOpost,并在我的iOS应用程序中实现sqrt14 :

double inline __declspec (naked) __fastcall sqrt14(double n) { _asm fld qword ptr [esp+4] _asm fsqrt _asm ret 8 } 

我已经在我的代码中修改了以下内容:

 double inline __declspec (naked) sqrt14(double n) { __asm__("fld qword ptr [esp+4]"); __asm__("fsqrt"); __asm__("ret 8"); } 

上面,我已经从方法定义中删除了“__fastcall”关键字,因为我的理解是它仅适用于x86。 以上分别为每条assembly线提供了以下错误:

参数列表中的意外标记

指令无效

指令无效

我试图通过一些内联的ASM指南和其他文章了解如何做到这一点,但我通常只是不熟悉的语言。 我非常了解MIPS,但是这些命令/寄存器似乎有很大不同。 例如,我不明白为什么原始作者从不在汇编代码中的任何位置使用传入的“n”值。

任何帮助得到这个工作将不胜感激! 我正在尝试这样做,因为我正在构build一个应用程序,在那里我需要计算sqrt(好吧,是的,我可以做一个查找表,但现在我关心精度很高)在每个像素的实时video提要。 我目前正在使用标准的sqrt,除了其余的计算,我运行在8fps左右。 希望能够在这一变化的情况下,把这一个或两个碰撞一下。

如果重要的话:我正在构build应用程序,以理想的方式与任何可以运行iOS 7.1的iOS设备兼容。再次,非常感谢您的帮助。

编译器完全可以生成fsqrt指令,不需要inline asm。 如果你使用-ffast-math你可能会得到一些额外的速度。

为了完整起见,这里是inline asm版本:

 __asm__ __volatile__ ("fsqrt" : "=t" (n) : "0" (n)); 

fsqrt指令没有明确的操作数,它隐含地使用堆栈的顶部。 =t约束告诉编译器期望fpu堆栈顶部的输出, 0约束指示编译器将input放在与输出#0相同的位置(即,再次fpu堆栈的顶部)。

请注意, fsqrt当然只有x86,这意味着它不会在ARM cpus上工作。

Interesting Posts