【问题标题】:Does Apple AS assembler replace certain NEON instructions with equivalent ones on iOS?Apple AS 汇编器是否将某些 NEON 指令替换为 iOS 上的等效指令?
【发布时间】:2012-04-18 07:19:09
【问题描述】:

我尝试在 iOS 上使用 ffmpeg,并在优化的 arm 代码中调试崩溃。我发现一些无符号(.u16,.u32)指令已被有符号(.i16,.i32)取代。很容易看出,因为 GDB 上的反汇编指令与源代码不太匹配。

例如,

vrshrn.u32 -> vrshrn.i32
vrshrn.u16 -> vrshrn.i16
vadd.u16 -> vadd.i16

我的问题:

  1. 这种行为是否正确且符合预期?如果不是,我们如何纠正它?
  2. 如果它们是等价的,为什么我们还需要未签名的呢?是不是因为这样代码更明确?
  3. 其他平台的工具包是否会出现这种行为?比如Android的工具包? (我听说苹果的 AS 很古老)

【问题讨论】:

    标签: ios ffmpeg arm neon


    【解决方案1】:

    通常,您可以放心,汇编器不会像某些编译器那样疯狂。 当汇编器改变一些指令时,它大多是完全等价的或伪指令。

    【讨论】:

      【解决方案2】:

      它们是相同的指令。该标志对操作没有影响。

      $ cat neon.s 
          .text
          .code 32
          .globl _foo
      _foo:
          vrshrn.u32 d0, q0, #1
          vrshrn.i32 d0, q0, #1
      
      $ otool -tv neon.o 
      neon.o:
      (__TEXT,__text) section
      _foo:
      00000000    f29f0850    vrshrn.i32  d0, q0, #1
      00000004    f29f0850    vrshrn.i32  d0, q0, #1
      

      【讨论】:

        【解决方案3】:

        这些指令不依赖于元素的签名 - 这实际上是 .Inn 后缀的意思。汇编器仍然接受.Snn.Unn 版本,但反汇编将只使用.Inn

        对于区分有符号整数和无符号整数的指令(例如VMULL),汇编器不接受.Inn 后缀,而只接受.Snn.Unn

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多