如何让这个sqrt内联汇编适用于iOS

时间:2014-04-25 19:20:21

标签: ios assembly inline-assembly

我正在尝试关注another SO post并在我的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。以上分别给出了每条装配线的以下错误:

参数列表中的意外标记

无效指令

无效指令

我试图阅读一些关于如何执行此操作的inline ASM guidesother posts,但我通常只是对该语言不熟悉。我非常了解MIPS,但这些命令/寄存器似乎非常不同。例如,我不明白为什么原作者从不在汇编代码中的任何地方使用传入的“n”值。

任何有助于此工作的帮助将不胜感激!我正在尝试这样做,因为我正在构建一个应用程序,我需要在实时视频源的每个像素上计算sqrt(好的,是的,我可以做一个查找表,但现在我非常关心精度) 。我目前正在使用标准sqrt,除了剩下的计算,我的运行速度大约为8fps。希望通过这种改变使这一两个碰撞。

如果重要:我正在构建应用程序,以便与任何可以运行iOS 7.1的当前iOS设备兼容。再次,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

编译器完全能够生成fsqrt指令,您不需要内联asm。如果您使用-ffast-math,则可能会获得额外的速度。

为了完整性'这里是内联asm版本:

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

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

请注意,fsqrt当然只是x86,这意味着它不适用于ARM cpus。