我正在尝试关注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 guides和other posts,但我通常只是对该语言不熟悉。我非常了解MIPS,但这些命令/寄存器似乎非常不同。例如,我不明白为什么原作者从不在汇编代码中的任何地方使用传入的“n”值。
任何有助于此工作的帮助将不胜感激!我正在尝试这样做,因为我正在构建一个应用程序,我需要在实时视频源的每个像素上计算sqrt(好的,是的,我可以做一个查找表,但现在我非常关心精度) 。我目前正在使用标准sqrt,除了剩下的计算,我的运行速度大约为8fps。希望通过这种改变使这一两个碰撞。
如果重要:我正在构建应用程序,以便与任何可以运行iOS 7.1的当前iOS设备兼容。再次,非常感谢您的帮助。
答案 0 :(得分:2)
编译器完全能够生成fsqrt
指令,您不需要内联asm。如果您使用-ffast-math
,则可能会获得额外的速度。
为了完整性'这里是内联asm版本:
__asm__ __volatile__ ("fsqrt" : "=t" (n) : "0" (n));
fsqrt
指令没有显式操作数,它隐式使用堆栈顶部。 =t
约束告诉编译器期望fpu堆栈顶部的输出,0
约束指示编译器将输入放在与输出#0
相同的位置(即。 fpu堆栈的顶部再次)。
请注意,fsqrt
当然只是x86,这意味着它不适用于ARM cpus。