【发布时间】:2015-12-16 21:13:19
【问题描述】:
我尝试为 64 位 iOS 应用程序编译一些内联汇编程序。
这是一个例子:
int roundff(float _value) {
int res;
float temp;
asm("vcvtr.s32.f32 %[temp], %[value] \n vmov %[res], %[temp]" : [res] "=r" (res), [temp] "=w" (temp) : [value] "w" (_value));
return res;
}
我有这个错误:
无法识别的指令助记符。
但是这段代码编译得很好:
__asm__ volatile(
"add %[result], %[b], %[a];"
: [result] "=r" (result)
: [a] "r" (a), [b] "r" (b), [c] "r" (c)
);
我发现在 aarch64 中我必须使用 fcvt 而不是 vcvt。因为
int a = (int)(10.123);
编译成
fcvtzs w8, s8
但我不知道如何在内联汇编器中编写它。像这样的
int roundff(float _value)
{
int res;
asm("fcvtzs %[res], %[value]" : [res] "=r" (res) : [value] "w" (_value));
return res;
}
也不起作用并生成此错误:
指令'fcvtz'不能设置标志,但指定了's'后缀。
指令操作数无效。
我还需要 round 而不是 trim。 (fcvtns)
有什么帮助吗?在哪里可以阅读有关 arm(32/64) asm 的更多信息?
更新 行。这:float res = nearintf(v) 编译成很好的指令 frinti s0 s0。但是为什么我的内联汇编器在使用 clang 编译器的 iOS 上不起作用?
【问题讨论】:
-
为什么要这样做?你用汇编做什么?
-
因为我需要最快的 round(float) 函数。 fcvtns 是浮点转换为有符号整数,四舍五入到最接近的偶数。
-
Google 从 arm.com 网站出现 this。如果您在内容窗格中打开“ARM 编译器 armasm 参考指南”条目,您将看到“一般指令”、“浮点指令”等条目。
-
作为一个建议,当涉及到 iOS 之类的东西时,我会避免像瘟疫一样的内联汇编。从长远来看,这只是自找麻烦。
-
您是否尝试过编写使用多个步骤来实现指令执行结果的 C 语言?然后检查编译器是否针对该指令对其进行了优化。
标签: ios objective-c xcode assembly