考虑这个问题: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");
}
我想知道组装代码中的最后一行是什么意思?看起来这里的参数是使用内联使用的寄存器名称等定义的。 有人可以详细说明吗?有谁知道任何解释这个的好资源?
答案 0 :(得分:3)
我对ARM汇编没有多少了解,但在GCC的内联汇编语法中,这三个部分分别是输出寄存器,输入寄存器和破坏寄存器。寄存器按它们出现的顺序编号,在这种情况下,输入寄存器以相同的顺序引用与输出寄存器相同的变量。 =r
是特定于体系结构的,但可能意味着“任何通用寄存器”。
所以你可以期望编译器选择四个方便的寄存器来放入四个变量(最有可能是ARM调用约定将它们放入?),并确保cc
,{{1}如有必要,我会保存{},r4
,d1
。您可以在程序集中使用d0
,%0
,%1
,%2
来引用这四个寄存器。反过来,编译器可以预期,当你完成后,你将不会破坏任何其他寄存器,并且变量的新值将在新寄存器中(这恰好与此寄存器中的旧寄存器相同)情况)。
另见GCC-Inline-Assembly-HOWTO - 它有点陈旧,但你应该可以从中得到一般的想法。