GCC What';使用ARM VFP指令操作的正确内联装配约束是什么?

GCC What';使用ARM VFP指令操作的正确内联装配约束是什么?,arm,constraints,inline-assembly,binutils,double-precision,Arm,Constraints,Inline Assembly,Binutils,Double Precision,我想使用Google NDKv8b附带的工具链(gcc-4.6)将双精度寄存器(d8)的值加载到ARM平台上的C变量中。我的手臂机器是三星Galaxy S2(它有VFPv3和霓虹灯)。GCC文档指出,为了在内联汇编上使用VFP双精度寄存器,必须使用“w”约束。 因此,我尝试了类似的方法(好的,不要过多地研究整个程序的逻辑): 我怎样才能做到这一点 谢谢 我对代码部分做了如下更改 "vmov.f64 %P[dTmp2], d8\n" 在此之后,我可以编译。我没有验证生成的代码 对于p约束,请查看

我想使用Google NDKv8b附带的工具链(gcc-4.6)将双精度寄存器(d8)的值加载到ARM平台上的C变量中。我的手臂机器是三星Galaxy S2(它有VFPv3和霓虹灯)。GCC文档指出,为了在内联汇编上使用VFP双精度寄存器,必须使用“w”约束。 因此,我尝试了类似的方法(好的,不要过多地研究整个程序的逻辑):

我怎样才能做到这一点


谢谢

我对代码部分做了如下更改

"vmov.f64 %P[dTmp2], d8\n"
在此之后,我可以编译。我没有验证生成的代码


对于
p
约束,请查看和此。

我认为不能使用vmov.f64在VFP和ARM寄存器之间移动数据。您应该使用“vmovrd,Rn,Dm”,但是我不能正确地使用内联汇编。是的,我确实不能。这是因为我告诉输出约束dTmp必须是一个双精度寄存器,准备写入(=w)。AFAIK gcc应该为dTmp变量使用范围为d0-d31的“d”寄存器(导致约束)。它可能是一个语法错误,因为它甚至没有编译。我升级到了binutils-2.22,但错误与binutils-2.21的错误完全相同。为什么不在汇编中编写完整的函数呢?正文的其余部分相当琐碎,应该利用您手动交错指令的能力(需要一些技巧),并通过重复使用其中一些指令和根据您对代码的了解进行优化(大部分不只是编译器)来减轻寄存器压力。这只是一个测试用例,我真正想要实现的是基于查询双精度寄存器(d8)以检索其值并将其复制到C变量中的能力。这个C变量将被检查它的值是否会改变,如果它的值与任意值不同,我会做一些事情(提高一个SIGINT)。我知道我可以使用其他技术实现它,但我真正想知道的是为什么我不能使用这个内联。问题出在哪里了。谢谢!它真的做到了我想要的:)
/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
"vmov.f64 %P[dTmp2], d8\n"