了解基本的在线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调用约定中的变量),并确保ccr4d1d0在必要时被保存。 您可以在程序集中使用%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)