GCC ARM如何使用内联汇编为特定fp寄存器赋值?
我很难给特定的fp寄存器赋值 例如,如果我使用通用寄存器,它可以编译并正常工作:GCC ARM如何使用内联汇编为特定fp寄存器赋值?,gcc,arm,inline-assembly,Gcc,Arm,Inline Assembly,我很难给特定的fp寄存器赋值 例如,如果我使用通用寄存器,它可以编译并正常工作: register uint* r1 asm ("r1") = (uint *) lrd; 但当我尝试对fp寄存器执行相同操作时: register float f3 asm ("f3") = 1.0; 我在编译过程中遇到以下错误: error: register specified for ‘f3’ isn’t suitable for data type 我使用以下命令行编译内核: /usr/bin
register uint* r1 asm ("r1") = (uint *) lrd;
但当我尝试对fp寄存器执行相同操作时:
register float f3 asm ("f3") = 1.0;
我在编译过程中遇到以下错误:
error: register specified for ‘f3’ isn’t suitable for data type
我使用以下命令行编译内核:
/usr/bin/arm-linux-gnueabi-gcc -c -march=armv7-a -mfpu=neon c_class.c
有什么建议可以解决这个问题吗?
f3
是传统的FPA寄存器命名,我找不到任何方法使我手头的交叉编译器(GCC 4.8.3)不会阻塞它,尽管有一个稍微不同的消息:
test.c:5:17: error: invalid register name for ‘f’
register float f asm("f3") = 42.0;
使用最新的VFP/NEON标志s3
:
register float f asm("s3") = 42.0;
工作正常,拆卸过程看起来很正常:
4: eddf 1a03 vldr s3, [pc, #12] ; 14 <main+0x14>
...
14: 42280000 .word 0x42280000
4:eddf 1a03 vldr s3[pc,#12];14
...
14:42280000.字0x42280000
它似乎也可以毫无怨言地指定双精度寄存器视图(d3
),尽管该视图仍然编译为等效单精度寄存器(s6
)的32位加载。我对软浮点(armel)使用了错误的交叉编译器(GCC 4.7.3)和AMRv4体系结构,而不是使用硬浮点(armhf)和ARMv7的交叉编译器。它适用于GCC 4.8.2和最新的VFP/NEON标志(s或d)。