代码之家  ›  专栏  ›  技术社区  ›  Thomas Zoechling

使用iphones simd浮点单位的浮点到整数转换

  •  4
  • Thomas Zoechling  · 技术社区  · 15 年前

    我目前正在尝试用Shark优化一些与DSP相关的代码,发现我在浮点到整数的转换中浪费了大量时间:

    SInt16 nextInt = nextFloat * 32768.0f + 0.5f;
    

    由于iPhone似乎有一个ARM11 FP协处理器,我想知道是否可以用FTOSI指令替换我的代码。 有一些 documentation 可在ARM网站上找到,但我在内嵌手工优化装配方面没有经验。 以前有人做过吗?
    我想我可以用

    __asm__ volatile
    

    但是如何检查指令是否可用?
    我如何传递我的价值?

    Eddi1: 正如路易斯已经指出的那样,我忘记了提到我在编译时关闭了“为拇指编译”。

    编辑2: 由于我想将float转换为signed int16而不是unsigned int,所以我将arm指令从ftoui更改为ftosi。这是原邮件中的一个错误。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Louis Gerbarg    15 年前

    这可能是一个显而易见的问题,但你确定你的目标是手臂吗?默认情况下,iphonessdk会编译所有的拇指应用程序,它使用软件浮点运算(包括浮点/int转换)。

    无论如何,如果设备有一个VFP协处理器,它就有一个指令。您可以通过读取fpsid寄存器并确保它是受支持的模型来检查它是否有适当的协处理器。

    我怀疑假设所有的iPhone都支持它是安全的。除此之外,苹果的汇编程序还支持操作码,LLVM ARM后端将其用于类型转换,这意味着当苹果最终在手机上支持LLVM时,其编译器将生成ftoui指令。