GCC ARM 如何使用内联汇编为特定的 fp 寄存器赋值?

GCC ARM How to assign value to particular fp register using 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/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

它似乎也毫无怨言地接受指定双精度寄存器视图 (d3),尽管它仍然编译为 32 位加载到等效的单精度寄存器 (s6 ).