为什么GCC在默认情况下禁用以下选项;韦斯特米尔;“建筑事件”;韦斯特米尔;支持他们

为什么GCC在默认情况下禁用以下选项;韦斯特米尔;“建筑事件”;韦斯特米尔;支持他们,gcc,Gcc,我想通过在带有GCC的RHEL5上启用-march=“westmile”来编译我的应用程序。但是,当我用gcc-march=westmile-Q--help=target查询gcc时,我会默认禁用下面的所有选项 -maes [disabled] -mcx16 [disabled] -mfxsr

我想通过在带有GCC的RHEL5上启用
-march=“westmile”
来编译我的应用程序。但是,当我用gcc-march=westmile-Q--help=target查询gcc时,我会默认禁用下面的所有选项

  -maes                                                 [disabled]
  -mcx16                                               [disabled]
  -mfxsr                                                 [disabled]
  -mmmx                                              [disabled]
  -mno-sse4                                        [enabled]
  -mpclmul                                           [disabled]
  -mpopcnt                                          [disabled]
  -msahf                                                [disabled]
  -msse                                                  [disabled]
  -msse2                                               [disabled]
  -msse3                                               [disabled]
  -msse4                                               [disabled]
  -msse4.1                                            [disabled]
  -msse4.2                                            [disabled]
  -mssse3                                             [disabled]
如果我查看GCC主页,它会说“Westmile”确实支持上面的所有指令集。如果是这样,为什么GCC在默认情况下不启用这些选项

如果我在应用程序编译中启用了它们,会对应用程序产生任何不利影响吗? 到目前为止,我正在另一个体系结构上使用这些选项,例如Sandybridge。
所以想知道如果他们在Westmile上被禁用,是否会产生任何影响?

-Q
是一个仅限开发人员的选项,它会导致
--help=target
打印本质上是内部信息的内容。在这种情况下,由于目标选择选项的实现方式,子选项设置不会反映总体设置的值

您可以查看预定义的预处理器宏,以确定编译器中实际启用的是什么。比较:

$ gcc -E -x c -dM /dev/null | grep SSE
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSE__ 1
致:


(请注意,Red Hat Enterprise Linux 5中的两个系统编译器(
gcc
gcc44
)都不支持
-march=westmile

我认为查看gcc中带有-mrach的不同ARCH之间是否有任何默认选项不同的最佳方法是,通过使用简单的测试程序将这些ARCH显式地传递给GCC并记录它们。稍后使用readelf读取传递给它们的默认选项

gcc-frecord gcc交换机-三月=本机Helloworld.cpp-o测试

readelf-p.GCC.command.line测试

gcc-frecord gcc开关-三月=Westmile Helloworld.cpp-o测试

readelf-p.GCC.command.line测试

在带有GCC4.9.1的RHEL5 x86上,上述命令显示了编译器作为默认选项传递的内容的细微差别。
正如我在问题中所说,默认情况下,将Westmile传递到-march并不会传递所有这些标志。

打印出来的内容会产生误导。gcc-6的效果更好。因此,如果上述命令显示类似的输出,那么我们可以假设两种体系结构的启用/禁用选项相同?(注意:我在RHEL5上使用gcc 4.9.1)不确定我是否理解这个问题。如果输出中包含相应的
\uu*\ uuuu
常量,编译器可能会使用这些指令,是的(当然不仅仅是在使用内部函数时,这取决于指令子集、编译器版本和优化级别)。
$ gcc -march=westmere -E -x c -dM /dev/null | grep SSE
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1