根据CPU功能在gcc中选择适当的ARM -mfpu选项

时间:2015-04-03 08:24:21

标签: c gcc arm compiler-optimization

我的CPU具有以下CPU功能

cat /proc/cpuinfo 
Processor       : ARMv7 Processor rev 4 (v7l)
processor       : 0
BogoMIPS        : 1192.96

processor       : 1
BogoMIPS        : 1197.05

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt 
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 4

Hardware        : sun7i
Revision        : 0000

gcc设置

-march=armv7ve -mfloat-abi=hard -mfpu=vfpv3-d16 -meabi=5

的选项

cat main.c
#include <stdio.h>

void main()
{
    printf("Hello World!\n");
}

编译
gcc -march=native -mtune=native -Q -v main.c

似乎是CPU功能支持的neon-vfpv4是否优于gcc设置的vfpv3-d16

我对vfpv3-d16的内容neon-vfpv4只有{{1}},而{{1}}上没有任何内容。

我正在使用gcc 4.9.1

1 个答案:

答案 0 :(得分:5)

-march-mtune(或-mcpu作为两者的简写)仅控制用于指令选择和调度的CPU选项。例如,使用基于GCC 4.8的交叉工具链,当我这样做时:

 arm-linux-gnueabihf-gcc -mcpu=arm250 -v -c test.c

我明白了:

...
COLLECT_GCC_OPTIONS='-mcpu=arm250' '-v' '-c' '-mfloat-abi=hard'
  '-mfpu=vfpv3-d16' '-mthumb' '-mtls-dialect=gnu'
...

这显然是无稽之谈 - ARM250以 long 方式先于VFP(甚至是Thumb) - 因为对于任何未指定的选项,它只是通过配置为默认值的任何内容: / p>

...
Configured with:
  ... --with-arch=armv7-a --with-tune=cortex-a9 --with-fpu=vfpv3-d16 ...
    ... --with-mode=thumb --with-float=hard

您的Cortex-A7确实支持完整的VFPv4和NEON,因此传递-mfpu=neon-vfpv4以覆盖默认值是正确的做法。不幸的是,它似乎不是一个等价的-mfpu=native选项(至少记录在案 - 我没有方便的原生工具链来检查)。