【问题标题】:GCC ARM How to assign value to particular fp register using inline assembly?GCC ARM 如何使用内联汇编为特定的 fp 寄存器赋值?
【发布时间】:2015-03-04 17:56:22
【问题描述】:

我无法为特定的 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

有什么建议可以解决这个问题吗?

【问题讨论】:

    标签: gcc arm inline-assembly


    【解决方案1】:

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

    【讨论】:

    • 我对软浮点 (armel) 和 AMRv4 架构使用了错误的交叉编译器 (GCC 4.7.3),而不是对硬浮点 (armhf) 和 ARMv7 使用交叉编译器。它适用于 GCC 4.8.2 和最新的 VFP/NEON 名称(s 或 d)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2014-09-19
    • 2021-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多