GCC使用ARM VFP指令操作的内联汇编约束是什么?

时间:2012-09-26 21:04:27

标签: arm constraints inline-assembly binutils double-precision

我想将双精度寄存器(d8)的值加载到ARM平台上的C变量中,并带有Google NDKv8b附带的工具链(gcc-4.6)。我的ARM机器是三星Galaxy S2(它有VFPv3和NEON)。 GCC文档说,为了在内联汇编中使用VFP双精度寄存器,必须使用“w”约束。 所以我试过这样的事情(好吧,不要过分关注整个程序的逻辑):

#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

我怎样才能做到这一点?

谢谢!

1 个答案:

答案 0 :(得分:4)

我已经更改了代码部分,如下所示

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

之后我可以编译。我没有验证生成的代码。

对于P约束,请查看Hardwarebug / ARM inline asm secrets和此email thread