3.4.109 –xarch=isa
指定指令集体系结构 (instruction set architecture, ISA)。
下表列出了 SPARC 和 x86 平台通用的 -xarch 关键字。
表 3-13 对 SPARC 和 x86 平台通用的 -xarch 关键字
|
|
generic
|
使用大多数处理器通用的指令集。这是缺省值。
|
generic64
|
为在大多数 64 位平台上获得良好性能而编译。此选项等效于 –m64 –xarch=generic,提供此选项的目的是为了与早期的发行版兼容。
|
native
|
为了在此系统上获得良好性能而进行编译。编译器为运行它的当前系统处理器选择适当的设置。
|
native64
|
为了在 64 位系统上获得良好性能而进行编译。该选项等效于 –m64 –xarch=native,提供该选项是为了与早期的发行版兼容。
|
|
请注意,尽管 -xarch 可以单独使用,但它是 –xtarget 选项扩展的一部分,并且可用于覆盖由特定 -xtarget 选项设置的 -xarch 值。例如:
% f95 -xtarget=ultra2 -xarch=sparcfmaf ...
会覆盖由 -xtarget=ultra2 设置的 -xarch。
通过只允许指定的指令集,此选项可将编译器生成的代码限定于指定指令集体系结构的指令。此选项不保证使用任何特定于目标的指令。
如果此选项与优化一起使用,则在指定的体系结构上,适当的选择可以为可执行文件提供良好性能。如果选择不当,则会导致二进制程序在预定的目标平台上无法执行。
请注意下列内容:
-
使用 generic、sparc、sparcvis2、sparcvis3、sparcfmaf、sparcima 编译的对象二进制文件 (.o) 可以链接起来并一起执行,但只能在支持链接的所有指令集的处理器上运行。
-
对于任何特定选择,生成的可执行文件在传统体系结构中可能不运行或运行缓慢。此外,由于在任何这些指令集体系结构中都不会实现四精度(REAL*16 和 long double)浮点指令,因此编译器不会在其生成的代码中使用这些指令。
未指定 -xarch 选项时的缺省值为 generic。
Table 3–14 提供了有关 SPARC 平台上每个 -xarch 关键字的详细信息。
表 3-14 SPARC 平台的 -xarch 值
|
|
sparc
|
针对 SPARC–V9 ISA 进行编译。针对 V9 ISA 进行编译,但不具备可视指令集 (Visual Instruction Set, VIS),也不具备特定于其他实现的 ISA 扩展。该选项在 V9 ISA 上使编译器生成高性能代码。
|
sparc4
|
针对 SPARC-V9 ISA 的 SPARC4 版本进行编译。允许编译器使用 SPARC-V9 指令集中的指令、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)以及浮点混合乘加指令、VIS 3.0 和 SPARC4 指令。
|
sparc4b
|
针对 SPARC-V9 ISA 的 SPARC4B 版本进行编译。允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展中的指令以及 SPARC T4 扩展中的 PAUSE 和 CBCOND 指令。
|
sparc4c
|
针对 SPARC-V9 ISA 的 SPARC4C 版本进行编译。允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括 VIS 1.0)、UltraSPARC-III 扩展(包括 VIS2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展、VIS 3.0 指令的 VIS3B 子集、SPARC T3 扩展的子集中的指令以及 SPARC T4 扩展中的 PAUSE 和 CBCOND 指令。
|
sparcvis
|
针对具有 UltraSPARC 扩展的 SPARC–V9 ISA 进行编译。针对 SPARC-V9 加可视指令集 (Visual Instruction Set, VIS) 版本 1.0 进行编译,并具有 UltraSPARC 扩展。该选项在 UltraSPARC 体系结构上使编译器生成高性能代码。
|
sparcvis2
|
针对具有 UltraSPARC-III 扩展的 SPARC-V9 ISA 进行编译。此选项允许编译器在具有 UltraSPARC III 扩展的 UltraSPARC 体系结构以及可视指令集 (VIS) 2.0 版上生成对象代码。
|
sparcvis3
|
针对 SPARC-V 9 ISA 的 SPARC VIS 版本 3 进行编译。允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0、UltraSPARC-III 扩展(包括可视指令集版本 2.0 以及混合乘加指令和可视指令集版本 3.0 中的指令。
|
sparcfmaf
|
针对 SPARC-V9 ISA 的 sparcfmaf 版本进行编译。允许编译器使用 SPARC-V9 指令集,加 UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)以及面向浮点乘加的 SPARC64 VI 扩展中的指令。
请注意,必须将 -xarch=sparcfmaf 与 -fma=fused 以及某些优化级别结合使用,来使编译器尝试寻找机会自动使用乘加指令。
|
sparcace
|
针对 SPARC-V9 ISA 的 sparcace 版本进行编译。使编译器可以使用如下指令集内的指令:SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、SPARC64 VI 扩展(用于浮点乘加)和 SPARC64 VII 扩展(用于整数乘加)和 SPARC64 X 扩展(用于 ACE 浮点)。
|
sparcaceplus
|
针对 SPARC-V9 ISA 的 sparcaceplus 版本进行编译。允许编译器使用 SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、面向浮点乘加的 SPARC64 VI 扩展、面向整数乘加的 SPARC64 VII 扩展、面向 SPARCACE 浮点的 SPARC64 X 扩展以及面向 SPARCACE 浮点的 SPARC64 X+ 扩展中的指令。
|
sparcima
|
针对 SPARC-V9 ISA 的 sparcima 版本进行编译。使编译器可以使用如下指令集内的指令:SPARC-V9 指令集、UltraSPARC 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 1.0)、UltraSPARC-III 扩展(包括可视指令集 (Visual Instruction Set, VIS) 版本 2.0)、SPARC64 VI 扩展(用于浮点乘加)和 SPARC64 VII 扩展(用于整数乘加)。
|
v9
|
与 -m64 -xarch=sparc 等效 使用 xarch=v9 来获取 64 位内存模型的传统 makefile 和脚本仅需使用 -m64。
|
v9a
|
与 -m64 -xarch=sparcvis 等效,并与早前的发行版兼容。
|
v9b
|
与 -m64 -xarch=sparcvis2 等效,并与早期的发行版兼容。
|
|
Table 3–15 详细介绍了 x86 平台上的每个 -xarch 关键字。如果未指定 -xarch,x86 上的缺省值为 generic(或者如果指定了 —m64 则为 generic64)。
表 3-15 x86 平台的 -xarch 值
|
|
386
|
将指令集限制于 Intel 386/486 体系结构。
|
pentium_pro
|
将指令集限制于 Pentium Pro 体系结构。
|
pentium_proa
|
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 Pentium Pro 体系结构中。
|
sse
|
将 SSE 指令集添加到 pentium_pro 中。(参见下面的注释。)
|
ssea
|
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE 体系结构中。
|
sse2
|
将 SSE2 指令集添加到 pentium_pro 中。(参见下面的注释。)
|
sse2a
|
将 AMD 扩展(3DNow!、3DNow! 扩展和 MMX 扩展)添加到 32 位 SSE2 体系结构中。
|
sse3
|
向 SSE2 指令集中添加 SSE3 指令集。
|
sse3a
|
将 AMD 扩展指令(包括 3dnow)添加到 SSE3 指令集。
|
amd64
|
在 Solaris 平台上,这与 -m64 -xarch=sse2 等效 使用 -xarch=amd64 来获取 64 位内存模型的传统 makefile 和脚本应使用 -m64。
|
amd64a
|
在 Solaris 平台上,这与 —m64 —xarch=sse2a 等效。
|
sse3a
|
将 AMD 扩展指令(包括 3DNow!)添加到 SSE3 指令集。
|
ssse3
|
将 SSSE3 指令添加到 SSE3 指令集。
|
sse4_1
|
将 SSE4.1 指令添加到 SSSE3 指令集。
|
sse4_2
|
将 SSE4.2 指令添加到 SSE4.1 指令集。
|
amdsse4a
|
将 SSE4a 指令添加到 AMD 指令集。
|
aes
|
添加 Intel 高级加密标准指令集。请注意,指定了 -xarch=aes 时,编译器不会自动生成 AES 指令,除非源代码包含使用了 AES 指令(或引用了 AES 内部函数)的 .il 内联代码、_asm 语句或汇编程序代码。
|
avx
|
使用 Intel 高级向量扩展指令集。
|
avx_i
|
将 Intel 高级向量扩展指令集与 RDRND、FSGSBASE 和 F16C 指令集一起使用。
|
avx2
|
使用 Intel 高级向量扩展 2 指令集。
|
|
3.4.109.1 x86/x64 平台的特别注意事项:
当针对 x86 Solaris 平台进行编译时,有几项重要的注意事项。
-
如果在 x86 平台上使用 —m64 编译或链接了某个程序的任意部分,则该程序的所有部分也都必须使用这些选项之一进行编译。有关各种 Intel 指令集体系结构(SSE、SSE2、SSE3、SSSE3 等)的详细信息,请参阅 Intel-64 和 IA-32《Intel Architecture Software Developer's Manual》
-
使用设置为 sse、sse2、sse2a 或 sse3 等的 -xarch 编译的程序必须在支持这些功能和扩展的平台上运行。
-
在本发行版中,-xarch=generic 的缺省指令集和含义已更改为 sse2。现在,如果在不指定目标平台选项的情况下进行编译,会导致 sse2 二进制与早期的 Pentium III 或早期的系统不兼容。
-
如果在不同的步骤中进行编译和链接,请始终使用编译器和相同的 -xarch 设置进行链接,以确保链接正确的启动例程。
-
x86 上的运算结果可能与 SPARC 上的结果不同,这是由 x86 80 字节浮点寄存器造成的。为了最大限度减少这些差异,请使用 -fstore 选项或使用 -xarch=sse2 进行编译(如果硬件支持 SSE2)。
-
如果在没有相应功能或指令集扩展的平台上运行使用这些 -xarch 选项编译的程序,则可能会导致段故障或不正确的结果,并且不显示任何显式警告消息。
-
如果程序中采用的 .il 内联汇编语言函数或 __asm() 汇编程序代码使用了 SSE、SSE2、SSE2a、SSE3 以及更高版本的指令和扩展,则此警告也适用于这类程序。