了解基本的内联 NEON 组件
Posted
技术标签:
【中文标题】了解基本的内联 NEON 组件【英文标题】:Understanding basic inline NEON assembly 【发布时间】:2012-11-25 00:22:40 【问题描述】:考虑这个问题:how to write inline assembly codes about LOOP in Xcode LLVM?
下面的内联汇编代码回答了这个问题:
void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity)
asm volatile (
"\t mov r4, #0\n"
"\t vdup.8 d1, %3\n"
"Lloop2:\n"
"\t cmp r4, %2\n"
"\t bge Lend2\n"
"\t vld1.8 d0, [%0]!\n"
"\t vqadd.s8 d0, d0, d1\n"
"\t vst1.8 d0, [%1]!\n"
"\t add r4, r4, #8\n"
"\t b Lloop2\n"
"Lend2:\n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r4", "d1", "d0");
我想知道汇编代码中的最后三行是什么意思?似乎参数在这里定义为内联使用的寄存器名称等。 有人可以详细说明一下吗?有谁知道任何解释这一点的好资源?
【问题讨论】:
【参考方案1】:具体的ARM汇编我不是很了解,但是在GCC的内联汇编语法中,三部分分别是输出寄存器、输入寄存器和clobbered寄存器。寄存器按它们出现的顺序编号,在这种情况下,输入寄存器以相同的顺序引用与输出寄存器相同的变量。 =r
是特定于体系结构的,但可能意味着类似于“任何通用寄存器”。
因此,您可以期望编译器选择四个方便的寄存器来将四个变量放入(很可能是 ARM 调用约定放入的那些?),并确保 cc
、r4
、@987654326 @、d0
会在必要时保存。您可以在程序集中使用%0
、%1
、%2
、%3
引用这四个寄存器。反过来,编译器可以预期,当你完成后,你不会破坏任何其他寄存器,并且变量的新值将在新寄存器中(恰好与旧寄存器相同)案例)。
另见GCC-Inline-Assembly-HOWTO——它有点老了,但你应该能够从中得到大致的想法。
【讨论】:
r 确实是“通用寄存器”和特定于架构的,请参阅此处以获取支持的类型列表hardwarebug.org/2010/07/06/arm-inline-asm-secrets 而据我所知,= 是标准语法,表示“输出寄存器”以上是关于了解基本的内联 NEON 组件的主要内容,如果未能解决你的问题,请参考以下文章