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 に答える