使用 iPhone SIMD 浮点单元进行浮点到整数转换
我目前正在尝试用 Shark 优化一些与 DSP 相关的代码,发现我在浮点到整数转换上浪费了很多时间:
SInt16 nextInt = nextFloat * 32768.0f + 0.5f;
由于 iPhone 似乎有一个 ARM11 FP 协处理器,我想知道是否可以替换我的代码与 FTOSI 指令。 有一些文档 可在 ARM 网站上找到,但我没有内联手动优化汇编的经验。 以前有人这样做过吗?
我想我可以内联代码
__asm__ volatile
但是如何检查指令是否可用?
我怎样才能传递我的值呢?
编辑1: 正如路易斯已经指出的那样,我忘记提及我正在关闭“Compile for Thumb”的情况下进行编译。
编辑2: 由于我想将 float 转换为有符号 Int16 而不是无符号 Int,因此我将 ARM 指令从 FTOUI 更改为 FTOSI。 这是原帖中的一个错误。
I am currently trying to optimize some DSP related code with Shark and found that I am wasting a lot of time in a float to integer conversion:
SInt16 nextInt = nextFloat * 32768.0f + 0.5f;
As the iPhone seems to have an ARM11 FP co-processor, I am wondering if I can replace my code with the FTOSI instruction.
There is some documentation available at the ARM website, but I have no experience in inlining hand optimized assembly.
Has someone done that before?
I think I could inline the code with
__asm__ volatile
But how do I check if the instruction is available?
How can I pass my value in?
EDIT1:
As Louis already pointed out, I forgot to mention that I am compiling with "Compile for Thumb" turned off.
EDIT2:
As I want to convert float to signed Int16 and not unsigned Int, I changed the ARM instruction from FTOUI to FTOSI. This was a mistake in the original post.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这可能是一个显而易见的问题,但你确定你的目标是 ARM 吗? 默认情况下,iPhone SDK 编译 THUMB 的所有应用程序,它使用软件浮点所有内容(包括浮点/整数转换)。
无论如何,如果设备有 VFP 协处理器,它就有指令。 您可以通过读取 FPSID 寄存器并确保它是受支持的型号来检查它是否具有合适的协处理器。
我怀疑可以肯定地假设所有 iPhone 都支持它。 除此之外,Apple 的汇编器支持操作码,并且 LLVM ARM 后端使用它进行类型转换,这意味着当 Apple 最终在手机上支持 LLVM 时,他们的编译器将生成 FTOUI 指令。
This may be an an obvious question, but are you sure you are targeting ARM? By default the iPhone SDK compiles all apps for THUMB, which uses software floating point everything (including float/int conversion).
Anyway, if the device has a VFP coprocessor it has the instruction. You can check if it has an appropriate coprocessor by reading the FPSID register and making sure it is a supported model.
I suspect it is safe to assume all iPhones support it. Among other things Apple's assembler has support for the opcode, and the LLVM ARM backend uses it for the type conversions, which means when Apple eventually supports LLVM on the phone their compiler is going to generate FTOUI instructions.