了解基本的在线NEON组装
考虑到这个问题:如何在Xcode LLVM中编写关于LOOP的内联汇编代码?
以下内联汇编代码回答了这一问题:
void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
"t mov r4, #0n"
"t vdup.8 d1, %3n"
"Lloop2:n"
"t cmp r4, %2n"
"t bge Lend2n"
"t vld1.8 d0, [%0]!n"
"t vqadd.s8 d0, d0, d1n"
"t vst1.8 d0, [%1]!n"
"t add r4, r4, #8n"
"t b Lloop2n"
"Lend2:n"
: "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
: "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
: "cc", "r4", "d1", "d0");
}
我想知道组合代码中最后三行的含义是什么? 看起来这些参数是在这里用内联使用的寄存器名称等来定义的。 有人可以详细说明这一点吗? 有没有人知道解释这个好资源?
我不太了解ARM程序集,但是在GCC的内联汇编语法中,这三个部分分别是输出寄存器,输入寄存器和破坏寄存器。 寄存器按其出现的顺序编号,在这种情况下,输入寄存器与输出寄存器的顺序相同。 =r
是特定于架构的,但可能意味着像“任何通用寄存器”之类的东西。
所以你可以期望编译器选择四个方便的寄存器来放置这四个变量(最有可能是ARM调用约定中的变量),并确保cc
, r4
, d1
, d0
在必要时被保存。 您可以在程序集中使用%0
, %1
, %2
, %3
来引用四个寄存器。 反过来,编译器可以预料,当你完成时,你不会破坏任何其他的寄存器,并且变量的新值将在新的寄存器中(恰好与此处的旧寄存器相同案件)。
另请参阅GCC-Inline-Assembly-HOWTO - 这有点旧,但你应该能够从中得到一般想法。
链接地址: http://www.djcxy.com/p/59745.html上一篇: Understanding basic inline NEON assembly
下一篇: help me with simple iphone arm assembly routine under xcode (inline or not)