【问题标题】:Why does armclang not use VCVT instruction for efficient integer to float conversion?为什么 armclang 不使用 VCVT 指令进行有效的整数到浮点转换?
【发布时间】:2021-06-24 19:12:44
【问题描述】:

我需要在带有 FPU 的 Cortex-M4 上将整数值转换为浮点值;例如:

float convert(int n) {
    return (float) n;
}

armclang 编译器将其翻译为:

        push    {r11, lr}
        mov     r11, sp
        sub     sp, sp, #8
        str     r0, [sp, #4]
        ldr     r0, [sp, #4]
        bl      __aeabi_i2f
        mov     sp, r11
        pop     {r11, lr}
        bx      lr

(天箭链接:https://godbolt.org/z/K59xGq78W

从 int 到 float 的转换是通过调用库例程 __aeabi_i2f 进行的,这比使用 FPU 指令 VCVT 效率低得多。

例如,GCC 使用 VCVT:

        push    {r7}
        sub     sp, sp, #12
        add     r7, sp, #0
        str     r0, [r7, #4]
        ldr     r3, [r7, #4]
        vmov    s15, r3 @ int
        vcvt.f32.s32    s15, s15
        vmov.f32        s0, s15
        adds    r7, r7, #12
        mov     sp, r7
        ldr     r7, [sp], #4
        bx      lr

(https://godbolt.org/z/Pdv3nEMYq)

有没有办法告诉 armclang 使用 VCVT 指令?

【问题讨论】:

  • 编译器选项 -mfloat-abi=hard 已设置。
  • 这个标志是不够的。你需要告诉编译器使用的是什么FPU

标签: c floating-point cortex-m armclang


【解决方案1】:

使用选项-march=armv7+fp 告诉编译器为带有 FPU 的机器生成代码。

Godbolt

【讨论】:

  • 谢谢。也许你也可以回答这个问题;如果我添加选项-ffp-mode=full(在 Armclang/ARM Compiler 6 中,不在 Godbolt 中),它也会调用该库。这是为什么呢?
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 2011-03-12
  • 1970-01-01
  • 2021-07-30
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多