2

考虑到这个问题:如何在 Xcode LLVM 中编写关于 LOOP 的内联汇编代码?

用以下内联汇编代码回答:

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");
}

我想知道汇编代码中的最后三行是什么意思?似乎参数在这里定义为内联使用的寄存器名称等。有人可以详细说明一下吗?有谁知道任何解释这一点的好资源?

4

1 回答 1

4

具体我对ARM汇编不是很了解,但是在GCC的内联汇编语法中,这三个部分分别是输出寄存器、输入寄存器和clobbered寄存器。寄存器按它们出现的顺序编号,在这种情况下,输入寄存器以相同的顺序引用与输出寄存器相同的变量。=r是特定于体系结构的,但可能意味着“任何通用寄存器”之类的东西。

因此,您可以期望编译器选择四个方便的寄存器来将四个变量放入(很可能是 ARM 调用约定放入的那些?),并确保在必要时保存cc, r4, d1, 。您可以在程序集中使用, , ,d0来引用四个寄存器。反过来,编译器可以预期,当您完成后,您不会破坏任何其他寄存器,并且变量的新值将在新寄存器中(恰好与此中的旧寄存器相同)案子)。%0%1%2%3

另请参阅GCC-Inline-Assembly-HOWTO - 它有点旧,但您应该能够从中得到大致的想法。

于 2012-11-25T00:47:14.450 回答