汇编asm代码,如何从不同的源点加载数据?

时间:2013-01-23 03:47:27

标签: neon

我试图改进一些代码,但对我来说似乎很难。 我在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加载数据。 有人可以帮帮我吗? 非常感谢。

1 个答案:

答案 0 :(得分:1)

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

更改行

:"r"(x)

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

将修复“未定义的命名操作数”问题。但是,我马上看到了一些潜在的问题。

首先,乘法指令的数据类型s32应为u32,因为您指定的xy属于unsigned int类型。

其次,您在行

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

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