4

Google NDKv8b に付属のツールチェーン (gcc-4.6) を使用して、倍精度レジスタ (d8) の値を ARM プラットフォームの C 変数にロードしたいと考えています。私の ARM マシンは Samsung Galaxy S2 です (VFPv3 と NEON が搭載されています)。GCC のドキュメントによると、インライン アセンブリで VFP 倍精度レジスタを使用するには、"w" 制約を使用する必要があります。だから私はこのようなことを試しました(OK、プログラム全体のロジックをあまり調べないでください):

#include <stdio.h>

int main()
{
    double dVar = 1.2345678;
    double dTmp;
    int i;
    for(i = 0; i < 100; i++ )
    {
        asm volatile(
            "vmov.f64 %[dTmp], d8\n"
            : [dTmp] "=w" (dTmp)
            :
            :
        );
        dVar *= 10.0;
        printf("d8 = %f\n", dTmp );
    }

    return 0;
}

まあ、それはコンパイルさえしません:

/tmp/cc9wQA1z.s: Assembler messages:
/tmp/cc9wQA1z.s:62: Internal error, aborting at /usr/local/google/home/andrewhsieh/ndk-andrewhsieh/src/build/../binutils/binutils-2.21/gas/config/tc-arm.c line 14709 in do_neon_mov

どうすればこれを達成できますか?

ありがとう!

4

1 に答える 1

4

コード部分を以下のように変更しました、

"vmov.f64 %P[dTmp2], d8\n"

この後、コンパイルできます。生成されたコードを検証しませんでした。

P制約については、Hardwarebug /ARMインラインasmシークレットとこの電子メールスレッドを参照してください。

于 2012-09-28T13:35:40.120 に答える