Apple AS汇编程序是否在iOS上用等效的指令替换某些NEON指令?

时间:2012-04-04 14:46:46

标签: ios ffmpeg arm neon

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

例如,

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

我的问题:

  1. 这种行为是否正确且预期?如果没有,我们如何纠正它?
  2. 如果它们是等价的,我们为什么还需要未签名的?这是因为代码更明确吗?
  3. 其他平台的工具包是否有这种行为?例如,Android的工具包? (我听说Apple的AS是一个古老的AS)

3 个答案:

答案 0 :(得分:4)

这些说明不依赖于元素的有效性 - 这实际上是.Inn后缀的含义。汇编程序仍然接受.Snn.Unn版本,但反汇编只会使用.Inn

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

答案 1 :(得分:3)

他们是同一条指令。该标志对操作没有影响。

$ 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

答案 2 :(得分:0)

总的来说,与一些编译器不同,你可以放心,汇编程序不会做任何事情。 当汇编程序改变某些指令时,它主要是精确等效或伪指令。