Raspberry Pi 2 NEON内联汇编指令无法正常工作

时间:2016-04-30 19:20:22

标签: gcc assembly arm raspberry-pi2 neon

我试图让我的旧代码运行得更快,因为我发现,RPi 2处理器支持NEON指令。所以我写了这段代码:

__asm__ __volatile__(
  "vld1.8 {%%d2, %%d3}, [%1];"
  "vld1.8 {%%d4, %%d5}, [%2];"
  "vaba.u8 %%q0, %%q1, %%q2;"
  "vst1.64 %%d0, [%0];"
  : "=r" (address_sad_intermediary)
  : "r" (address_big_pic), "r" (address_small_pic)
  :
);

然后在C中,主要的悲伤变量与sad_intermediary相加。

主要目标是计算绝对差值之和,因此我将big_pic中的16 B加载到q1寄存器中,将16 B从small_pic加载到q2寄存器中,将SAD计算为q0,然后将较低的8 B从q0加载到中介变量。问题是,由此产生的悲伤是零。

我使用 GCC 4.9.2 -std = c99 -pthread -O3 -lm -Wall -march = armv7-a -mfpu = neon-vfpv4 -mfloat-abi = hard 选项。

你看到代码有什么问题吗?感谢。

1 个答案:

答案 0 :(得分:1)

你永远不会将任何东西加载到q0中,所以vaba正在为未初始化的寄存器添加绝对差值。看起来你还没有声明你正在修改哪些寄存器。

但我不知道这是否是你问题的原因,因为我对内联汇编不太方便。不过,你可能不应该使用内联汇编来做这样的事情。如果使用intrinsics,则编译器具有更强的优化代码的能力。像这样:

#include <arm_neon.h>

...
uint8x8_t s = vld1_u8(address_sad_intermediary);
s = vaba_u8(s, vld1_u8(address_big_pic), vld1_u8(address_small_pic));
vst1_u8(address_sad_intermediary, s);

(请注意,此代码仅适用于8个字节,因为您只在代码中保存了8个字节)