我试图改进一些代码,但对我来说似乎很难。 我在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加载数据。 有人可以帮帮我吗? 非常感谢。
答案 0 :(得分:1)
编译器无法“看到”内联汇编内的变量名称,并且必须包含在输入/输出操作数列表中。
更改行
:"r"(x)
到
:[x]"r"(x),[y]"r"(y)
将修复“未定义的命名操作数”问题。但是,我马上看到了一些潜在的问题。
首先,乘法指令的数据类型s32
应为u32
,因为您指定的x
和y
属于unsigned int
类型。
其次,您在行
中后加y
但不加x
"vld1.32 {d2-d5}, [%[x]] \n\t"
"vld1.32 {d6-d9}, [%[y]]! \n\t"
除非这是故意的,否则最好保持一致。