为什么 armclang 不使用 VCVT 指令进行高效的整数到浮点数的转换?
Why does armclang not use VCVT instruction for efficient integer to float conversion?
我需要在带有 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
(神箭 Link: 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指令?
使用选项 -march=armv7+fp
告诉编译器为带有 FPU 的机器生成代码。
我需要在带有 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
(神箭 Link: 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指令?
使用选项 -march=armv7+fp
告诉编译器为带有 FPU 的机器生成代码。