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

时间:2015-03-04 17:56:23

标签: 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/arm-linux-gnueabi-gcc -c -march=armv7-a -mfpu=neon c_class.c

有任何建议如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

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)。