0

我试图改进一些代码,但对我来说似乎很难。我在 Android NDK 上开发。我想改进的 C++ 代码如下:

unsigned int test_add_C(unsigned int *x, unsigned int *y) {
unsigned int result = 0;
for (int i = 0; i < 8; i++) {
    result += x[i] * y[i];
}
return result;

}

和霓虹灯代码:

unsigned int test_add_neon(unsigned *x, unsigned *y) {

unsigned int result;
__asm__ __volatile__(
        "vld1.32    {d2-d5}, [%[x]] \n\t"
        "vld1.32    {d6-d9}, [%[y]]!    \n\t"
        "vmul.s32   d0, d2, d6      \n\t"
        "vmla.s32   d0, d3, d7      \n\t"
        "vmla.s32   d0, d4, d8      \n\t"
        "vmla.s32   d0, d5, d9      \n\t"
        "vpadd.s32  d0, d0          \n\t"
        "vmov       %0, r4, d0      \n\t"
        :"=r"(result)
        :"r"(x)
        :"d0", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "r4"
);
return result;

}

但是当我编译代码时,它会提示未定义的命名操作数“x”和“y”。我不知道如何从数组 x 和 y 加载数据。有人可以帮助我吗?多谢。

4

1 回答 1

1

内联汇编中的变量名不能被编译器“看到”,并且必须包含在输入/输出操作数列表中。

换行

:"r"(x)

:[x]"r"(x),[y]"r"(y)

将解决您的“未定义命名操作数”问题。但是,我马上看到了更多潜在的问题。

首先,s32您的乘法指令的数据类型应该是u32,因为您指定xyunsigned int类型。

其次,你后期增量y但不在x行中

"vld1.32    {d2-d5}, [%[x]]     \n\t"
"vld1.32    {d6-d9}, [%[y]]!    \n\t"

除非这是故意的,否则最好保持一致。

于 2013-01-23T16:15:21.923 回答